home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 139 < prev    next >
Text File  |  1996-03-23  |  115KB  |  3,302 lines

  1. C.S.M.P. Digest             Wed, 06 Mar 96       Volume 3 : Issue 139
  2.  
  3. Today's Topics:
  4.  
  5.         Bizarre trap patching problem
  6.         FastRandom() source
  7.         Hi ho, Hi ho, STR#ing we will go.
  8.         How do I switch printers without the Chooser?
  9.         On obtaining rowBytes... (Was Re: Video Memory Access)
  10.         PEF (Preferred Executable Format) Info Needed
  11.         Reconnecting Mounted Appleshare Volumes
  12.         Stuck in a bottleneck
  13.         USENET Macintosh Programming Awards (UMPA)
  14.         [Q] NURBs and lighting
  15.         pragma once vs #ifndef
  16.  
  17.  
  18.  
  19. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  20. (pottier@clipper.ens.fr).
  21.  
  22. The digest is a collection of article threads from the internet
  23. newsgroups comp.sys.mac.programmer.help, csmp.tools, csmp.misc and
  24. csmp.games. It is designed for people who read news semi-regularly and
  25. want an archive of the discussions.  If you don't know what a
  26. newsgroup is, you probably don't have access to it. Ask your systems
  27. administrator(s) for details. If you don't have access to news, you
  28. may still be able to post messages to the group by using a mail server
  29. like anon.penet.fi (mail help@anon.penet.fi for more information).
  30.  
  31. Each issue of the digest contains one or more sets of articles (called
  32. threads), with each set corresponding to a 'discussion' of a particular
  33. subject.  The articles are not edited; all articles included in this digest
  34. are in their original posted form (as received by our news server at
  35. nef.ens.fr).  Article threads are not added to the digest until the last
  36. article added to the thread is at least two weeks old (this is to ensure that
  37. the thread is dead before adding it to the digest).  Article threads that
  38. consist of only one message are generally not included in the digest.
  39.  
  40. The digest is officially distributed by two means, by email and ftp.
  41.  
  42. If you want to receive the digest by mail, send email to listserv@ens.fr
  43. with no subject and one of the following commands as body:
  44.     help                        Sends you a summary of commands
  45.     subscribe csmp-digest Your Name    Adds you to the mailing list
  46.     signoff csmp-digest            Removes you from the list
  47. Once you have subscribed, you will automatically receive each new
  48. issue as it is created.
  49.  
  50. The official ftp info is ftp://ftp.dartmouth.edu/pub/csmp-digest.
  51. Questions related to the ftp site should be directed to
  52. scott.silver@dartmouth.edu.
  53.  
  54. -------------------------------------------------------
  55.  
  56. >From nigel.stanger@stonebow.otago.ac.nz (Nigel Stanger)
  57. Subject: Bizarre trap patching problem
  58. Date: 13 Feb 1996 01:16:02 GMT
  59. Organization: Dept. of Information Science, University of Otago
  60.  
  61. This is weird -- I've written a patch to _Control (still working on this
  62. MacTCP sending stuff), and it works fine... on 68k machines. If I install
  63. it on my LC at home, the patch is activated fine and does what it's
  64. supposed to. If I install it on my 6100 at work, the patch is again
  65. activated fine and does what it's supposed to. _However_, after the patch
  66. has finished executing, at some point I've been unable to determine tha
  67. machine crashes with an illegal instruction. This occurs at a location in
  68. low memory (somewhere around $70!), so I'm guessing that somewhere in
  69. there is a jump to NIL.
  70.  
  71. The bit that's got me though is that this happens _after_ the patch has
  72. finished executing and returned (I know this for a fact, I stepped through
  73. it in MacsBug). How _long_ after is anyone's guess.
  74.  
  75. The only difference I can think of is that the patch in both cases is
  76. being activated from Eudora, which is fat. When I run it at home, the
  77. patch is called from 68k code. When I run it at work, it's called from PPC
  78. code. Note that _Control gets called a lot by the OS without any hiccups
  79. on both architectures. Is there something I should be doing that I'm not
  80. aware of?
  81.  
  82. I do know that _Control is called at interrupt time, but I'm not aware of
  83. anything I do that's dangerous in that respect; does that even matter in
  84. the PPC environment anyway? I suppose it does, given that I'm patching a
  85. 68k trap with 68k code. But then, why does it crash on the PPC and not the
  86. 68k? Weird.
  87.  
  88. My code looks something roughly like this (CW8, BTW, and excuse any typos):
  89.  
  90. typedef OSErr (*ControlProcPtr)(ParmBlkPtr pb:__A0):__D0;
  91. ControlProcPtr gOldTrap;
  92.  
  93. #pragma parameter __D0 main(__A0)
  94. OSErr main(ParmBlkPtr pb);
  95.  
  96. OSErr main(ParmBlkPtr pb:__A0):__D0
  97. {
  98.   TCPiopb *tcpPB = (TCPiopb)pb;
  99.  
  100.   if (pb->csCode == TCPSend)
  101.   {
  102.     // I can't remember the exact code here, but it goes something like this:
  103.     // get stream ptr from tcpPB and stuff it into a TCPStatus PB
  104.     if (PBControlSync(statusPB) == noErr)
  105.     {
  106.       if (statusPB.remotePort == 25) [SMTP]
  107.       {
  108.         // wdsEntry *theWDS = the WDS from tcpPB ;
  109.         while (theWDS->length)
  110.         {
  111.           //if (theWDS->ptr == pattern)
  112.              // beep (will eventually do things to WDS contents)
  113.           else theWDS++;
  114.         }
  115.      }
  116.   }
  117.   gOldTrap(pb);
  118. }
  119.  
  120. I might have to dig up the real code and post it. Anyway, can anyone see
  121. anything obviously dangerous in the above?
  122.  
  123. =====================================================================
  124. Nigel Stanger,           Internet: nigel.stanger@stonebow.otago.ac.nz
  125. University of Otago,     Phone: +64 3 479-8179
  126. Dunedin, NEW ZEALAND.    Fax:   +64 3 479-8311
  127.  
  128. +++++++++++++++++++++++++++
  129.  
  130. >From chris-b@cs.auckland.ac.nz (Chris Burns)
  131. Date: Tue, 13 Feb 1996 16:51:53 +1300
  132. Organization: HyperMedia Unit, Comp Sci, Auckland University
  133.  
  134. In article <nigel.stanger-1302961418000001@ou176027.otago.ac.nz>,
  135. nigel.stanger@stonebow.otago.ac.nz (Nigel Stanger) wrote:
  136.  
  137. >This is weird -- I've written a patch to _Control (still working on this
  138. >MacTCP sending stuff), and it works fine... on 68k machines. If I install
  139. >it on my LC at home, the patch is activated fine and does what it's
  140. >supposed to. If I install it on my 6100 at work, the patch is again
  141. >activated fine and does what it's supposed to. _However_, after the patch
  142. >has finished executing, at some point I've been unable to determine tha
  143. >machine crashes with an illegal instruction. This occurs at a location in
  144. >low memory (somewhere around $70!), so I'm guessing that somewhere in
  145. >there is a jump to NIL.
  146. >
  147. >The bit that's got me though is that this happens _after_ the patch has
  148. >finished executing and returned (I know this for a fact, I stepped through
  149. >it in MacsBug). How _long_ after is anyone's guess.
  150. >
  151. >The only difference I can think of is that the patch in both cases is
  152. >being activated from Eudora, which is fat. When I run it at home, the
  153. >patch is called from 68k code. When I run it at work, it's called from PPC
  154. >code. Note that _Control gets called a lot by the OS without any hiccups
  155. >on both architectures. Is there something I should be doing that I'm not
  156. >aware of?
  157. >
  158. >I do know that _Control is called at interrupt time, but I'm not aware of
  159. >anything I do that's dangerous in that respect; does that even matter in
  160. >the PPC environment anyway? I suppose it does, given that I'm patching a
  161. >68k trap with 68k code. But then, why does it crash on the PPC and not the
  162. >68k? Weird.
  163. >
  164. >My code looks something roughly like this (CW8, BTW, and excuse any typos):
  165. >
  166. >typedef OSErr (*ControlProcPtr)(ParmBlkPtr pb:__A0):__D0;
  167. >ControlProcPtr gOldTrap;
  168. >
  169. >#pragma parameter __D0 main(__A0)
  170. >OSErr main(ParmBlkPtr pb);
  171. >
  172. >OSErr main(ParmBlkPtr pb:__A0):__D0
  173. >{
  174. >  TCPiopb *tcpPB = (TCPiopb)pb;
  175. >
  176. >  if (pb->csCode == TCPSend)
  177. >  {
  178. >    // I can't remember the exact code here, but it goes something like this:
  179. >    // get stream ptr from tcpPB and stuff it into a TCPStatus PB
  180. >    if (PBControlSync(statusPB) == noErr)
  181. >    {
  182. >      if (statusPB.remotePort == 25) [SMTP]
  183. >      {
  184. >        // wdsEntry *theWDS = the WDS from tcpPB ;
  185. >        while (theWDS->length)
  186. >        {
  187. >          //if (theWDS->ptr == pattern)
  188. >             // beep (will eventually do things to WDS contents)
  189. >          else theWDS++;
  190. >        }
  191. >     }
  192. >  }
  193. >  gOldTrap(pb);
  194. >}
  195. >
  196. >I might have to dig up the real code and post it. Anyway, can anyone see
  197. >anything obviously dangerous in the above?
  198.  
  199. What about calling thru to the original trap with the proper mixed mode
  200. call? I patched _PBMountVol and the guts of the patch looked like this:
  201.  
  202.  
  203.  
  204. #if !GENERATINGCFM
  205. OSErr main (ParmBlkPtr PBPtr:__A0):__D0
  206. #else
  207. ProcInfoType __procinfo = uppPBMountVolProcInfo;
  208. OSErr main (unsigned short TrapWord,ParmBlkPtr PBPtr)
  209. #endif
  210.  
  211. {
  212. #if !GENERATINGCFM
  213. // Set up "A4 World"
  214. long SavedA4 = SetCurrentA4();
  215. #endif
  216.  
  217.  
  218. // Get globals
  219.  
  220.    Err = Gestalt(gestaltGlobals,(long*)&Globals);
  221.    if (Err != noErr)
  222.    {
  223.       DebugStr("\p_Gestalt FAILED");
  224.       goto Done;
  225.    }
  226.  
  227.  
  228. // Call old trap
  229.  
  230. #if GENERATINGCFM
  231.  
  232. // DebugStr("\pPPC;G");
  233.  
  234.    Err =
  235. CallOSTrapUniversalProc((*Globals).OldPBMountVol,uppPBMountVolProcInfo,TrapWord,PBPtr);
  236.    if (Err != noErr)
  237.    {
  238.       DebugStr("\p_CallOSTrapUniversalProc((*Globals).OldPBMountVol) FAILED");
  239.       goto Done;
  240.    }
  241.  
  242. #else
  243.  
  244. // DebugStr("\p68K;G");
  245.  
  246.    Err = ((PBMountVolProc)((*Globals).OldPBMountVol))(PBPtr);
  247.    if (Err != noErr)
  248.    {
  249.       DebugStr("\p(*Globals).OldPBMountVol() FAILED;G");
  250.       goto Done;
  251.    }
  252.    
  253. #endif
  254.  
  255.  
  256. // Body of function (this is a "head" patch)
  257.  
  258.  
  259. Done:
  260. #if !GENERATINGCFM
  261.    SetA4(SavedA4);
  262. #endif
  263.  
  264.    return Err;
  265. }
  266.  
  267.  
  268. The different function prototypes was something to do with Metrowerks
  269. pushing the TrapWord on the stack for OS traps (this may not be required
  270. anymore??).
  271.  
  272. A ptr to my globals was stored as a Gestalt value (check out the
  273. GestaltValue libraries around the place).
  274.  
  275. On thinking about it, I may not have needed the "#if GENERATINGCFM" in the
  276. body of the function as this functionality is probably provided in
  277. CallOSTrapUniversalProc.
  278.  
  279.  
  280. Hope this helps...
  281.  
  282. Chris B
  283. - ---------------------------------------------------------------------
  284. NewZealand:AucklandUniversity:ComputerScience:HyperMediaUnit:ChrisBurns
  285. Internet: chris-b@cs.auckland.ac.nz
  286. Phone:    +64 9 373-7599 x5602
  287. Fax:      +64 9 373-7453                         Async, Therefore I Am.
  288. - ---------------------------------------------------------------------
  289.  
  290. +++++++++++++++++++++++++++
  291.  
  292. >From jwwalker@millennianet.com (James W. Walker)
  293. Date: Mon, 12 Feb 1996 21:32:51 -0800
  294. Organization: Nisus Software, Inc.
  295.  
  296. In article <nigel.stanger-1302961418000001@ou176027.otago.ac.nz>,
  297. nigel.stanger@stonebow.otago.ac.nz (Nigel Stanger) wrote:
  298.  
  299. >My code looks something roughly like this (CW8, BTW, and excuse any typos):
  300.  
  301. >typedef OSErr (*ControlProcPtr)(ParmBlkPtr pb:__A0):__D0;
  302. >ControlProcPtr gOldTrap;
  303.  
  304. >#pragma parameter __D0 main(__A0)
  305. >OSErr main(ParmBlkPtr pb);
  306.  
  307. >OSErr main(ParmBlkPtr pb:__A0):__D0
  308. >{
  309. ... stuff deleted
  310. >  gOldTrap(pb);
  311. >}
  312.  
  313. A couple of ideas:
  314.  
  315. 1. Your function fails to return a value.  Was that just a typo in your
  316. post, or a real error?
  317.  
  318. 2. _Control needs to look at register D1 to tell whether it is a
  319. synchronous or asynchronous call, right?  But by the time you call
  320. gOldTrap, your code may have munged D1. For that matter, are you sure you
  321. don't need to know if you're synchronous?
  322. -- 
  323.   --  Jim Walker
  324.  
  325. +++++++++++++++++++++++++++
  326.  
  327. >From pottier@drakkar.ens.fr (Francois Pottier)
  328. Date: 13 Feb 1996 13:31:46 GMT
  329. Organization: Ecole Normale Superieure, Paris, France
  330.  
  331. In article <nigel.stanger-1302961418000001@ou176027.otago.ac.nz>,
  332. Nigel Stanger <nigel.stanger@stonebow.otago.ac.nz> wrote:
  333.  
  334. >    // I can't remember the exact code here, but it goes something like this:
  335. >    // get stream ptr from tcpPB and stuff it into a TCPStatus PB
  336. >    if (PBControlSync(statusPB) == noErr)
  337.  
  338. You're making a synchronous call at interrupt time here. Are you sure
  339. this is OK? I'm no expert in these matters, but I think you might have
  340. to make an asynchronous call (only if your patch was called
  341. asynchronously, of course) and do the rest of your stuff from the
  342. completion routine.
  343.  
  344. Just my $0.01,
  345.  
  346.  
  347. -- 
  348. Francois Pottier
  349. Francois.Pottier@ens.fr
  350. Francois.Pottier@inria.fr
  351. http://www.eleves.ens.fr:8080/home/pottier/
  352.  
  353. +++++++++++++++++++++++++++
  354.  
  355. >From devon@apple.com (Devon Hubbard)
  356. Date: Tue, 13 Feb 1996 12:32:31 -0800
  357. Organization: Apple Computer
  358.  
  359. In article <chris-b-1302961651530001@hmu104.hmu.auckland.ac.nz>,
  360. chris-b@cs.auckland.ac.nz (Chris Burns) wrote:
  361.  
  362. [original text/reply snipped]
  363.  
  364. > The different function prototypes was something to do with Metrowerks
  365. > pushing the TrapWord on the stack for OS traps (this may not be required
  366. > anymore??).
  367.  
  368. Quick fyi here.  The requirement for the trap word to be the first
  369. parameter in patched OS traps IS NOT a necessity brought on my
  370. CodeWarrior.  It's a requirement for patching OS traps period.  Look at IM
  371. PowerPC System Software for the details (sorry I don't have the page #
  372. handy).  If you are patching any OS trap, you will get and have to pass
  373. through the trap word as the first parameter.
  374.  
  375. Before even attempting to suggest things for the crash itself, can you
  376. post/send the source for your patching and UPP procInfo declarations?
  377.  
  378. Cheers,
  379. dEVoN
  380.  
  381. +++++++++++++++++++++++++++
  382.  
  383. >From nigel.stanger@stonebow.otago.ac.nz (Nigel Stanger)
  384. Date: 14 Feb 1996 01:17:48 GMT
  385. Organization: Dept. of Information Science, University of Otago
  386.  
  387. In article <chris-b-1302961651530001@hmu104.hmu.auckland.ac.nz>,
  388. chris-b@cs.auckland.ac.nz (Chris Burns) wrote:
  389.  
  390. > What about calling thru to the original trap with the proper mixed mode
  391. > call? I patched _PBMountVol and the guts of the patch looked like this:
  392. [...snip...]
  393.  
  394. This is something I thought of the other day, but I didn't know enough
  395. about the mechanics of mixed mode stuff to figure out how to do it (I've
  396. read the article in develop 16, but that's about it). Your example might
  397. be enough for me to figure out what to do. I'll try it and see. Thanks!
  398.  
  399. =====================================================================
  400. Nigel Stanger,           Internet: nigel.stanger@stonebow.otago.ac.nz
  401. University of Otago,     Phone: +64 3 479-8179
  402. Dunedin, NEW ZEALAND.    Fax:   +64 3 479-8311
  403.  
  404. +++++++++++++++++++++++++++
  405.  
  406. >From nigel.stanger@stonebow.otago.ac.nz (Nigel Stanger)
  407. Date: 15 Feb 1996 22:23:16 GMT
  408. Organization: Dept. of Information Science, University of Otago
  409.  
  410. In article <jwwalker-1202962132510001@dialppp-1-28.millennianet.com>,
  411. jwwalker@millennianet.com (James W. Walker) wrote:
  412.  
  413. > A couple of ideas:
  414. > 1. Your function fails to return a value.  Was that just a typo in your
  415. > post, or a real error?
  416.  
  417. It's just a typo. The real code actually looks like this:
  418.  
  419. OSErr theErr;
  420. ...
  421. theErr = gOldTrap(pb);
  422. ...
  423. return theErr;
  424.  
  425. > 2. _Control needs to look at register D1 to tell whether it is a
  426. > synchronous or asynchronous call, right?  But by the time you call
  427. > gOldTrap, your code may have munged D1. For that matter, are you sure you
  428. > don't need to know if you're synchronous?
  429.  
  430. Now that's a damn good point, and something that doesn't seem to be very
  431. well documented (I certainly haven't seen it anywhere obvious). Any
  432. suggestions on how to stop it getting stomped on?
  433.  
  434. As to whether it's sync or async, I don't think it really matters from the
  435. point of view of my code. What I'm doing is inspecting the contents of the
  436. outgoing SMTP stream, and changing certain elements of it (for useful
  437. purposes I might add :) Whether it's async or sync is pretty much
  438. irrelevant, I think.
  439.  
  440. =====================================================================
  441. Nigel Stanger,           Internet: nigel.stanger@stonebow.otago.ac.nz
  442. University of Otago,     Phone: +64 3 479-8179
  443. Dunedin, NEW ZEALAND.    Fax:   +64 3 479-8311
  444.  
  445. +++++++++++++++++++++++++++
  446.  
  447. >From jlscott@tigr.org (John L. Scott)
  448. Date: Fri, 16 Feb 1996 15:40:25 GMT
  449. Organization: The Institute for Genomic Research
  450.  
  451. In article <nigel.stanger-1602961125180001@ou176027.otago.ac.nz>,
  452. nigel.stanger@stonebow.otago.ac.nz (Nigel Stanger) wrote:
  453.  
  454. > In article <jwwalker-1202962132510001@dialppp-1-28.millennianet.com>,
  455. > jwwalker@millennianet.com (James W. Walker) wrote:
  456. > > 2. _Control needs to look at register D1 to tell whether it is a
  457. > > synchronous or asynchronous call, right?  But by the time you call
  458. > > gOldTrap, your code may have munged D1. For that matter, are you sure you
  459. > > don't need to know if you're synchronous?
  460. > Now that's a damn good point, and something that doesn't seem to be very
  461. > well documented (I certainly haven't seen it anywhere obvious). Any
  462. > suggestions on how to stop it getting stomped on?
  463.  
  464. In CodeWarrior at least, you can do this:
  465.  
  466. #pragma parameter __D0 MyPBControl(__D1, __A0)
  467.  
  468. pascal OSErr MyPBControl(unsigned short trapWord, TCPParmBlkPtr paramBlock)
  469.  
  470. > As to whether it's sync or async, I don't think it really matters from the
  471. > point of view of my code. What I'm doing is inspecting the contents of the
  472. > outgoing SMTP stream, and changing certain elements of it (for useful
  473. > purposes I might add :) Whether it's async or sync is pretty much
  474. > irrelevant, I think.
  475.  
  476. Ah but it is relevant.  If you make a synchronous call to a device driver
  477. at interupt time, you may deadlock the driver.  If you want to intercept
  478. asynchronous call you'll have to make your calls asynchronous as well.  I
  479. wouldn't worry about using a completion routine though.  Make your call
  480. and busy-wait until it's complete, then move on.  This scheme should work
  481. whether the intercepted call is asyncronous or not.
  482.  
  483. --John Scott
  484.  
  485. +++++++++++++++++++++++++++
  486.  
  487. >From nigel.stanger@stonebow.otago.ac.nz (Nigel Stanger)
  488. Date: 19 Feb 1996 01:18:08 GMT
  489. Organization: Dept. of Information Science, University of Otago
  490.  
  491. In article <jlscott-1602961040250001@192.207.234.72>, jlscott@tigr.org
  492. (John L. Scott) wrote:
  493.  
  494. > In CodeWarrior at least, you can do this:
  495. > #pragma parameter __D0 MyPBControl(__D1, __A0)
  496. > pascal OSErr MyPBControl(unsigned short trapWord, TCPParmBlkPtr paramBlock)
  497.  
  498. Yep, I thought of that myself, tried it a couple of nights ago, and now it
  499. works! No more crashes! Whee! :)
  500.  
  501. > Ah but it is relevant.  If you make a synchronous call to a device driver
  502. > at interupt time, you may deadlock the driver.  If you want to intercept
  503. > asynchronous call you'll have to make your calls asynchronous as well.  I
  504. > wouldn't worry about using a completion routine though.  Make your call
  505. > and busy-wait until it's complete, then move on.  This scheme should work
  506. > whether the intercepted call is asyncronous or not.
  507.  
  508. Oh, OK, I should be able to code that in about 10 minutes. Thanks!
  509.  
  510. =====================================================================
  511. Nigel Stanger,           Internet: nigel.stanger@stonebow.otago.ac.nz
  512. University of Otago,     Phone: +64 3 479-8179
  513. Dunedin, NEW ZEALAND.    Fax:   +64 3 479-8311
  514.  
  515. ---------------------------
  516.  
  517. >From Andrew Welch <andrew@AmbrosiaSW.com>
  518. Subject: FastRandom() source
  519. Date: Tue, 13 Feb 1996 18:54:00 -0500
  520. Organization: Ambrosia Software, Inc.
  521.  
  522. While converting an application to be PowerPC native, I noticed that an A-Trap 
  523. it made heavy use of (_Random) was not yet native.  So I did a quick and dirty 
  524. translation of the _Random 68K assembler code into C.
  525.  
  526. It's pretty self-explanitory -- call FastRandom(0) to initialize the random 
  527. number seed, or pass any positive value in the range parameter to generate a 
  528. psuedo-random number between 0..range - 1
  529.  
  530. Enjoy... and remember, you get what you pay for. :)
  531.  
  532. // 
  533. - ----------------------------------------------------------------------------
  534. - -
  535. // -- Return a random value between 0 and range - 1
  536.  
  537. short FastRandom(short range)
  538. {
  539. short        result;
  540. static        unsigned    long                randomSeed;
  541. register    unsigned    long                calc;
  542. register    unsigned    long                regD0;
  543. register    unsigned    long                regD1;
  544. register    unsigned    long                regD2;
  545.  
  546. if (range == 0)
  547.     randomSeed = LMGetTicks() + LMGetTime();
  548. else
  549.     {
  550.     calc = randomSeed;
  551.     regD0 = 0x41A7;
  552.     regD2 = regD0;
  553.     
  554.     regD0 *= calc & 0x0000FFFF;
  555.     regD1 = regD0;
  556.     
  557.     regD1 = regD1 >> 16;
  558.     
  559.     regD2 *= calc >> 16;
  560.     regD2 += regD1;
  561.     regD1 = regD2;
  562.     regD1 += regD1;
  563.     
  564.     regD1 = regD1 >> 16;
  565.     
  566.     regD0 &= 0x0000FFFF;
  567.     regD0 -= 0x7FFFFFFF;
  568.     
  569.     regD2 &= 0x00007FFF;
  570.     regD2 = (regD2 << 16) + (regD2 >> 16);
  571.     
  572.     regD2 += regD1;
  573.     regD0 += regD2;
  574.     
  575.     if (regD0 < 0)
  576.         regD0 += 0x7FFFFFFF;
  577.     
  578.     randomSeed = regD0;
  579.     
  580.     if ((regD0 & 0x0000FFFF) == 0x8000)
  581.         regD0 &= 0xFFFF0000;
  582.  
  583. // -- Now that we have our pseudo random number, pin it to the range we want
  584.  
  585.     regD1 = range;
  586.     regD1 *= (regD0 & 0x0000FFFF);
  587.     regD1 = (regD1 >> 16);
  588.     
  589.     result = regD1;
  590.     }
  591.     
  592.     
  593. return result;
  594. }    // -- FastRandom
  595.  
  596. -- 
  597. +--------------------------------------------------------------+
  598. |    Andrew Welch - Thaumaturgist - Ambrosia Software, Inc.    |
  599. +-------------------------------+------------------------------+
  600. |    AOL-> Keyword: Ambrosia    |  eWorld-> Shortcut: Ambrosia |
  601. |    CIS-> GO word: Ambrosia    |  http://www.AmbrosiaSW.com/  |
  602. +-------------------------------+------------------------------+
  603.  
  604. +++++++++++++++++++++++++++
  605.  
  606. >From michel_saucier@cmq.qc.ca (Michel Saucier)
  607. Date: Sat, 17 Feb 1996 16:20:14 -0400
  608. Organization: Bell Global Solutions
  609.  
  610. About FastRandom()...
  611.  
  612.  Here is another algorithm to generate pseudorandom values. 
  613.  It's quite fast, faster than the classic congruential method, and
  614. generates 32 random bits
  615.  at each call, instead of 16. It uses only XOR and AND, (no MULT, DIV or MOD).
  616.  
  617.  It needs a 1024 bits seed (32 longints) and has a period of 4294967295.
  618.  Changing the seed values gives a completely different sequence, instead of
  619.  merely changing the starting point.
  620.  
  621.  The function is only two lines of C. The only hard part is to initialize
  622. the startup array
  623.  with 32 uncorrelated full-32 bits values, a non-trivial task, as the
  624. NetScape's folks can attest!
  625.       This is left as an exercice.
  626.  
  627.  The code:
  628.  
  629. static unsigned long AInd=0;
  630. static unsigned long AMem[32];
  631. unsigned long alea(void) /* LFSR-based random generator, with a 32
  632. longwords memory */
  633. { unsigned long i=AInd++%32; /* 32 LFSR are maintained in parallel, bitwise */
  634.   return AMem[i]^=AMem[(i+1)%32]^AMem[(i+2)%32]
  635. ^AMem[(i+4)%32]^AMem[(i+6)%32]^AMem[(i+31)%32]; 
  636. }
  637.  
  638.   And the related functions:
  639.  
  640. long ralea(long range) /* return a pseudorandom value in 1..range */
  641. {return 1+alea()%range;}
  642.  
  643. static long LHseed=1; /* please kindly CHANGE ME */
  644. unsigned long lehmer(void)/* Lehmer algorithm, Schrage's method to avoid
  645. overflow */
  646. {long hi=LHseed/127773L,lo=LHseed%127773L; /* a very smart compiler would
  647. DIV once */
  648.  long t=lo*16807L - hi*2836L;
  649.  return LHseed=(t>0)?t:t+2147483647L;
  650. }
  651.  
  652. int checkAMem(void) /* 0 means AMem[] is unacceptable, 1 means OK */
  653. { int i; unsigned long t;
  654.    for(i=0,t=0;i<32;i++) t|=AMem[i]; /* Test AMem[] bitwise */
  655.    return 0==~t; /* all columns contain at least one non-zero bit? */
  656. }
  657.    
  658. void initAMem(void) /* stretches out a 31 bits seed to create 1024 bits
  659. seed. Avoid.  */
  660. { int i; LHseed=(long)clock();
  661.   for(i=0;i<32;i++) AMem[i]=lehmer()^lehmer()<<16; /* do not use this one
  662. in real life */
  663.   assert(0!=checkAMem()); /* should be extremely rare */
  664. }
  665.  
  666.  
  667.   Thou shalt not tamper with the alea() algorithm. It applies a CRC-type
  668. polynom bitwise,
  669. maintaining 32 LFSR-like sequences. Any "amelioration", like ADDing the 5
  670. values instead of XORing them, or smartly ROTating the XOR result, is
  671. *VERY* likely to drastically _reduce_ the period
  672. of the generator.
  673. Consider this as a fair warning. And don't ever use alea() for cryptography.
  674.  
  675.   NO ONE ever abolish'd randomness by a crapshoot. (Mallarme)
  676.  
  677. michel_saucier@cmq.qc.ca
  678.  
  679. +++++++++++++++++++++++++++
  680.  
  681. >From michel_saucier@cmq.qc.ca (Michel Saucier)
  682. Date: Mon, 19 Feb 1996 00:14:17 -0400
  683. Organization: Bell Global Solutions
  684.  
  685. About alea()...
  686.  
  687. static unsigned long AInd=0;
  688. static unsigned long AMem[32];
  689. unsigned long alea(void)     /* LFSR-based random generator, with a 32
  690. longwords memory */
  691. { unsigned long i=AInd++%32; /* 32 LFSR are maintained in parallel, bitwise */
  692.   return AMem[i]^=AMem[(i+1)%32]^AMem[(i+2)%32]
  693. ^AMem[(i+4)%32]^AMem[(i+6)%32]^AMem[(i+31)%32]; 
  694. }
  695.  
  696. The function is only two lines of C. The only hard part is to initialize
  697. the startup array with 32 uncorrelated full-32 bits values, a non-trivial
  698. task, as the NetScape's folks can attest!
  699.  
  700. >> Andrew Welch - Thaumaturgist - Ambrosia Software, Inc.
  701. >> Interesting.  How would you suggest initializing those values?
  702.  
  703. In fact, if all you want is an honest and fast pseudo-random numbers generator,
  704. any set of 32 bits values is sufficient, provided no bit position contains
  705. a 0 on all 32 longwords, and there is no trivial pattern in the values.
  706.   "0F0FF0F00F0F..." would definitvely be a bad startup seed.
  707. The checkAMem() will cause an assert() error for these degenerate cases.
  708.  
  709.  So you can use the MAC/OS (16 bits) or the C (31 bits) random generator,
  710. and use it
  711. to seed the AMem[] startup array. The period of the alea() generator will
  712. still be maximum.
  713. The only downside is that a 16 bits "streched seed" can only construct
  714. 32768 different
  715. startup arrays (each one producing 4294967295 random numbers without
  716. repetition), instead
  717. of having potentially 2^1024 different random generators, each one
  718. generating a unique 
  719. sequence of 2^32 longwords of 32 random bits. Do you dig the difference ?
  720.  
  721.  It's only when you are using this random generator in cryptography that
  722. you MUST build 
  723. a completely unguessable 1024 bits startup seed.
  724.  There are many ways to achieve this:
  725.  
  726.     - Have the user flip a coin 1024 time (unobserved by anyone) and
  727. record the results.
  728.  
  729.     - Attach a Geiger counter to the computer.
  730.  
  731.     - Sample the ambiant noise by a microphone attached to the mac. 
  732.  
  733.     - Have the user type a LONG passphrase. Discard the ASCII codes, use
  734. instead the
  735.         timing between the keystrokes.
  736.  
  737.     - Build a composite of many values taken in the hardware or the
  738. operating system:
  739.          clock, current address, timebase registers, performance
  740. registers, total number
  741.          of cache hits, number of bytes processed by the file system,
  742. current mouse position,
  743.          XOR of the display screen bitmap, current scanline, etc... etc..
  744.  
  745. See Bruce Shneier "Applied Cryptography", chapter 15, for more on this topic.
  746. See also Colin Plumb "Truly Random Numbers", Dr Dobb's Journal, November
  747. 1994, for a background
  748. task who collects mouseclics and keypresses, and integrates them in a pool
  749. "stirred" by the
  750. well-known hash MD5.
  751.  
  752. ______________________________________________
  753.  
  754.  I haven't yet timed my routine alea() against lehmer() on a PowerMac. On
  755. my 68040's 660AV,
  756. I have timed 350000 calls to alea() by second, against 142000/s for
  757. lehmer(), the typical
  758. congruential generator. If I optimize lehmer() in assembly, they are about
  759. the same speed.
  760.  
  761. lehmer::
  762.     MOVE.L  seed,D1
  763.     DIVS.L  #127773,D0:D1 ; Quotient and remainder
  764.     MULS.L  #16807,D0 
  765.     MULS.L  #2836,D1
  766.     SUB.L   D1,D0
  767.     BGT.S   @1
  768.     ADD.L   #1247483647,D0
  769. @1: MOVE.L  D0,seed
  770.     RTS
  771.  
  772. alea() is about 40 instructions long, but slightly faster because it
  773. contains no MULt, DIV
  774. nor BRanches, only XOR, ANDs, and addressing. There are 6 memory reads and
  775. 2 writes.
  776. When alea() is used to initialize a long list of random values, the AMem[]
  777. array fits nicely
  778. in the processor cache.
  779.  
  780.   I am still searching a way to increase the period of the generator to 2^1024,
  781. but any tampering, like INCrementing the XORed values, will void the
  782. mathematical property
  783. which assure of a 2^32-1 period. On can, of course, combine the output of
  784. the generator with
  785. another random generator of a different period.
  786.  
  787.   If the (parallel) LFSR is used alone, an astute cryptographer needs only
  788. 32 words or less
  789. known plaintext to reconstruct the initialisation vector and decrypt the
  790. mrest of the message(s).
  791.  
  792.  "God do not play with dice" A. Einstein
  793.  
  794. Michel Saucier, michel_saucier@cmq.qc.ca
  795.  
  796. +++++++++++++++++++++++++++
  797.  
  798. >From CatGuy@lamg.com (Milo Shiff)
  799. Date: 20 Feb 1996 07:17:43 GMT
  800. Organization: Los Angeles Macintosh Group BBS
  801.  
  802. In message ID <31212498.12A8@AmbrosiaSW.com> on 2/13/96, andrew@AmbrosiaSW.com
  803. wrote:
  804.  
  805. a> While converting an application to be PowerPC native, I noticed
  806. a> that an A-Trap  it made heavy use of (_Random) was not yet native. 
  807. a> So I did a quick and dirty  translation of the _Random 68K
  808. a> assembler code into C.
  809.  
  810.    If speed is of utmost concern, build a table of random numbers at or
  811. before compile time. Make sure the table is large enough to meet your
  812. intended purposes.
  813.  
  814.    On the other hand, if a reliable pseudo-number generator is desired, use
  815. well proven methods, duplicated ubiquitously in various books.
  816.  
  817. - Sent via BulkRate 2.1
  818.  
  819. ---------------------------
  820.  
  821. >From Daniel Bogan <danielb@bighand.com.au>
  822. Subject: Hi ho, Hi ho, STR#ing we will go.
  823. Date: Fri, 02 Feb 1996 10:45:13 +1000
  824. Organization: Big Hand Asia Pacific
  825.  
  826. While i'm in a -in-need-of-help binge...
  827.  
  828. Can someone supply me with code (THINK C) on how to write Str255's 
  829. back out to a STR# resource. Say, I have 5 Str255's and I want to write 
  830. them out to the one STR# resource in the order I supply.
  831.  
  832. I'll probably think of something else to ask pretty soon. I can feel it.
  833.  
  834. Ta.
  835.  
  836. +++++++++++++++++++++++++++
  837.  
  838. >From svh+@pitt.edu (Shawn V. Hernan)
  839. Date: 2 Feb 1996 17:31:14 GMT
  840. Organization: The University of Pittsburgh
  841.  
  842. In article <31115E99.47EA@bighand.com.au>
  843. Daniel Bogan <danielb@bighand.com.au> writes:
  844.  
  845. > Can someone supply me with code (THINK C) on how to write Str255's 
  846. > back out to a STR# resource.
  847.  
  848.  
  849. The press is in love with the World Wide Web, but usenet is still where
  850. all the cool stuff happens. Not two days ago, I had the same question.
  851. There is some good sample code at 
  852.  
  853. <http://www.AmbrosiaSW.com/cgi-bin/getsnippet.pl?file=/alt.sources.mac/s
  854. nippets-v01/packstr255>
  855.  
  856. The basic idea is to implement the C structure yourself (an int
  857. followed by asciiz strings) and use AddResource (or similar) to
  858. actually do the writing. 
  859.  
  860. Two key points I discovered are :
  861.  
  862. 1) If you're using an already exisitng resource, be sure to call
  863. DetachResource. 
  864.  
  865. 2) If you're building your own resource in memory be create a real
  866. handle using NewHandle or similar, and be sure to lock it prior to
  867. making changes. 
  868.  
  869. Thanks to Dave Nebinger, Jim Derry, Francis H. Shiffer, Paulo Casanova,
  870. Maf Vosburgh and others for the info . 
  871.  
  872. Shawn
  873.  
  874. Shawn V. Hernan                 |
  875. Systems and Networks            |
  876. The University of Pittsburgh    |  Dump the RICO Laws
  877. svh+@pitt.edu                   |
  878. 412-624-6425                    |
  879.  
  880. +++++++++++++++++++++++++++
  881.  
  882. >From yennie@aol.com (Yennie)
  883. Date: 5 Feb 1996 16:58:23 -0500
  884. Organization: America Online, Inc. (1-800-827-6364)
  885.  
  886. Something like this (warning this is Compileit! style junk and just a
  887. stab-- it might be useless)
  888.  
  889. put newHandle(length(strings)+numStrings) into STRhand
  890. put STRhand@ into STRptr
  891. HLock STRhand
  892. put STR1 into STRptr@.str255Type
  893. put STRptr + (length(STR1)+1) into STRptr
  894. put STR2 into STRptr@.str255Type
  895. put STRptr + (length(STR2)+1) into STRptr
  896. put STR3 into STRptr@.str255Type
  897. put STRptr + (length(STR3)+1) into STRptr
  898. put STR4 into STRptr@.str255Type
  899. put STRptr + (length(STR4)+1) into STRptr
  900. put STR5 into STRptr@.str255Type
  901. HUnlock STRhand
  902. AddResource STRhand,bla bla,bla bla,bla bla --(I can't remember the order
  903. of params for "AddResource")
  904. WriteResource STRhand -- if you need it now
  905.  
  906. Hope this helps...
  907.  
  908.  
  909. +++++++++++++++++++++++++++
  910.  
  911. >From dbrosius@chesco.com (Dave M Brosius)
  912. Date: 17 Feb 1996 08:00:37 GMT
  913. Organization: Chester County Internet Services, Inc.
  914.  
  915. In article <31115E99.47EA@bighand.com.au>, danielb@bighand.com.au wrote:
  916.  
  917. > While i'm in a -in-need-of-help binge...
  918. > Can someone supply me with code (THINK C) on how to write Str255's 
  919. > back out to a STR# resource. Say, I have 5 Str255's and I want to write 
  920. > them out to the one STR# resource in the order I supply.
  921. > I'll probably think of something else to ask pretty soon. I can feel it.
  922. > Ta.
  923.  
  924.  
  925. Handle   CreateStrPound( StringPtr *pStrings, long lStrCount )
  926. {
  927.    Handle hStrPound;
  928.    char   *pDst;
  929.    long   lCurString;
  930.    long   lSize;
  931.  
  932.    for (lCurString = 0, lSize = 0; 
  933.         lCurString < lStrCount;
  934.         lSize += pStrings[lCurString][0] + 1, lCurString++
  935.        );
  936.  
  937.    hStrPound = NewHandle( lSize );
  938.    ThrowIfNull( hStrPound ); // C++ was invented for those who don't
  939.                              // want to document error handling
  940.  
  941.    HLock( hStrPound );
  942.    for (lCurString = 0, pDst = *hStrPound; 
  943.         lCurString < lStrCount; 
  944.         pDst += pString[lCurString][0]+1, lCurString++
  945.        )
  946.       memcpy( pDst, 
  947.               pString[lCurString], 
  948.               ((unsigned char) pString[lCurString][0])+1 );
  949.  
  950.    HUnlock( hStrPound );
  951.    return hStrPound;
  952. }
  953.  
  954. -- 
  955. Please reply via email as well
  956. dave dbrosius@chesco.com
  957.  
  958. ---------------------------
  959.  
  960. >From jrichmond@mcn.net (Jason Richmond)
  961. Subject: How do I switch printers without the Chooser?
  962. Date: Sat, 03 Feb 96 20:40:46 GMT
  963. Organization: Montana Communications Network
  964.  
  965. I am writing an application for the Mac and I need to send output to two 
  966. different network printers. I need to do this from within the program, hidden 
  967. from the user. Is there any way to do this? 
  968.  
  969. +++++++++++++++++++++++++++
  970.  
  971. >From grinch@ns.moran.com (The Grinch)
  972. Date: 8 Feb 1996 21:56:22 GMT
  973. Organization: Vortex Software
  974.  
  975. Don't quote me, but I think the answer lies in extended PRAM, which you're
  976. really not supposed to mess with. (Like that ever stops anybody.) As far
  977. as I know, the only way to change XPRAM is through assembly. If you figure
  978. it out, I'd love to see the source!
  979.  
  980. Good luck!
  981. -The Grinch
  982.  
  983. +++++++++++++++++++++++++++
  984.  
  985. >From gurgle@dnai.com (Pete Gontier)
  986. Date: Sat, 10 Feb 1996 12:03:23 -0800
  987. Organization: Cellular
  988.  
  989. In article <4f06q3$ltp@news.mcn.net>,
  990. jrichmond@mcn.net (Jason Richmond) wrote:
  991.  
  992.  > I am writing an application for the Mac and I need to send output to two 
  993.  > different network printers. I need to do this from within the program,
  994. hidden 
  995.  > from the user. Is there any way to do this? 
  996.  
  997. No. Network printer drivers expect to be chosen with Chooser. In the case
  998. of LaserWriter, for example, when you choose a new printer, the driver
  999. verifies what kind of LaserWriter it is and chooses a PPD file for it. I
  1000. expect other drivers perform similar stunts.
  1001.  
  1002. If for some reason you are writing an application which is guranteed to
  1003. run in a closed environment (ex.: LaserWriter guaranteed), you might
  1004. choose to [a] select the generic LaserWriter PPD in Chooser, [b] have your
  1005. program modify the 'PAPA' resource in the driver itself, [c] remove
  1006. Chooser from the system so the user can't confuse things. Of course, this
  1007. has a number of limitations, not least of which is it will eventually
  1008. break, it will limit you to LaserWriters, it will disable any fun features
  1009. of individual printers, etc. etc.
  1010.  
  1011. - -----------------------------
  1012.  
  1013.   Pete Gontier -- Apple Macintosh Developer Technical Support
  1014.   <URL:mailto:gurgle@dnai.com> -- <URL:http://www.dnai.com/~gurgle>
  1015.  
  1016. +++++++++++++++++++++++++++
  1017.  
  1018. >From carl.gustafson@ece.drexel.edu (Carl Gustafson)
  1019. Date: Mon, 12 Feb 1996 12:42:17 -0500
  1020. Organization: Imaging and Computer Vision Center, Drexel University
  1021.  
  1022. In article <4f06q3$ltp@news.mcn.net>, jrichmond@mcn.net (Jason Richmond) wrote:
  1023.  
  1024. > I am writing an application for the Mac and I need to send output to two 
  1025. > different network printers. I need to do this from within the program, hidden 
  1026. > from the user. Is there any way to do this? 
  1027.  
  1028. There are a few resources in the System file that tell what printer driver
  1029. and printer to use. Changing them will change the selected printer, but I
  1030. don't recall what the resources are, nor do I particularly recommend doing
  1031. it. OTOH, it is a free country, so try if you like.
  1032.  
  1033. -- 
  1034. Carl Gustafson
  1035. Imaging and Computer Vision Center
  1036. Drexel University, Philadelphia, Penna
  1037. - ----------------------------------------------------------
  1038. I don't speak for Drexel, and Drexel doesn't listen to me...
  1039.  
  1040. +++++++++++++++++++++++++++
  1041.  
  1042. >From dschwarz@netcom.com (Dan Schwarz)
  1043. Date: Wed, 21 Feb 1996 03:37:32 GMT
  1044. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1045.  
  1046. In article <4f06q3$ltp@news.mcn.net>, jrichmond@mcn.net (Jason Richmond) wrote:
  1047.  
  1048. > I am writing an application for the Mac and I need to send output to two 
  1049. > different network printers. I need to do this from within the program, hidden 
  1050. > from the user. Is there any way to do this? 
  1051.  
  1052. Yes, but it's an awful lot of work. My shareware program, "PrinterSwitch"
  1053. does this; it took a couple weeks of (part-time) coding to get the switching
  1054. code working properly. You can check it out at:
  1055.  
  1056. http://www.cs.brandeis.edu/~dan/home.html
  1057.  
  1058. Basically, what you have to do is this:
  1059.  
  1060. Write the appropriate 'alis' and 'STR ' resources into the System
  1061. file, these point to the printer driver you want to use.
  1062.  
  1063. Write the appropriate 'PAPA' and/or 'PSEL' resourcs into the printer driver's
  1064. resource fork.
  1065.  
  1066. Switch to the appropriate parsed PPD file (if you're using LaserWriter 7 or 8
  1067. drivers) 
  1068.  
  1069. ... but where to find the "appropriate" resources and PPD resources to use?
  1070. aha! that's the tough part. You have to make the user switch to the printer(s)
  1071. that are to be used, each in turn, then your code will have to read in these
  1072. resources and store them away safely somewhere. That's what I do.
  1073. If you have total control over the environment in which your application is to be used, i.e. this is an in-house application to run on one system, you can
  1074. prep this stuff ahead of time and store it in your application.
  1075.  
  1076. For more info, I highly recommend reading Apple's Printing Q&As, and
  1077. the issue of Develop magazine that talked about fun with PRGeneral and other
  1078. printing tips. You can find both on the web, at http://www.dev.info.apple.com/
  1079.  
  1080. good luck!
  1081.  
  1082. _Dan
  1083.  
  1084.  
  1085.  
  1086.  
  1087.  
  1088. ---------------------------
  1089.  
  1090. >From Lawson English <english@primenet.com>
  1091. Subject: On obtaining rowBytes... (Was Re: Video Memory Access)
  1092. Date: 11 Feb 1996 09:26:02 -0700
  1093. Organization: Primenet (602)395-1010
  1094.  
  1095. Chris De Salvo <phixus@deltanet.com> wrote:
  1096. [snipt]
  1097. :    rowBytes = (**(**theGDH).gdPMap).rowBytes & 0x7FFF;
  1098.  
  1099. All the working code samples that I have uses 0x3fff, not 0x7fff.
  1100.  
  1101.  
  1102. Anyone know if it makes any difference in the real world?
  1103.  
  1104.  
  1105. --
  1106. - -----------------------------------------------------------------------------
  1107. Lawson English                            __  __     ____  ___       ___ ____
  1108. english@primenet.com                     /__)/__) / / / / /_  /\  / /_    /
  1109.                                         /   / \  / / / / /__ /  \/ /___  /
  1110. - -----------------------------------------------------------------------------
  1111.  
  1112. +++++++++++++++++++++++++++
  1113.  
  1114. >From jwbaxter@olympus.net (John W. Baxter)
  1115. Date: Sun, 11 Feb 1996 10:32:12 -0800
  1116. Organization: Internet for the Olympic Peninsula
  1117.  
  1118. In article <4fl5aq$t7c@nnrp1.news.primenet.com>, Lawson English
  1119. <english@primenet.com> wrote:
  1120.  
  1121. >Chris De Salvo <phixus@deltanet.com> wrote:
  1122. >[snipt]
  1123. >:    rowBytes = (**(**theGDH).gdPMap).rowBytes & 0x7FFF;
  1124. >
  1125. >All the working code samples that I have uses 0x3fff, not 0x7fff.
  1126. >
  1127. >
  1128. >Anyone know if it makes any difference in the real world?
  1129.  
  1130. Hi, Lawson,
  1131.  
  1132.    I'm not sure it makes any current real-world difference.  However, the
  1133. value rowBytes is specified as being less than 0x4000 (IM: Imaging with
  1134. QuickDraw, page 4-47), and the top two bits are specified as being used as
  1135. flags.  No use of bit 14 is given on that page (leaving a few other IM
  1136. pages where it might be--a check of Advanced Color Imaging would be a good
  1137. idea, but I can't lay hands on it in paper form right now and don't feel
  1138. like checking a CD version).
  1139.  
  1140.    --John
  1141.  
  1142. -- 
  1143.   The primary cause of problems is solutions.
  1144. John W. Baxter    Port Ludlow, WA     jwbaxter@olympus.net
  1145.  
  1146. +++++++++++++++++++++++++++
  1147.  
  1148. >From dmpalmer@clark.net (David M. Palmer)
  1149. Date: 11 Feb 1996 13:51:14 -0500
  1150. Organization: Clark Internet Services, Inc., Ellicott City, MD USA
  1151.  
  1152. Lawson English <english@primenet.com> writes:
  1153.  
  1154. >Chris De Salvo <phixus@deltanet.com> wrote:
  1155. >[snipt]
  1156. >:    rowBytes = (**(**theGDH).gdPMap).rowBytes & 0x7FFF;
  1157.  
  1158. >All the working code samples that I have uses 0x3fff, not 0x7fff.
  1159.  
  1160.  
  1161. >Anyone know if it makes any difference in the real world?
  1162.  
  1163. I believe it does.  I seem to remember seeing Rowbytes 0xC??? on something
  1164. I was doing recently, possibly in a GWorld.
  1165.  
  1166. I didn't see the basenote, so I don't know if this has been mentioned, but
  1167. other things I have learned about GWorlds, which you may as well do even
  1168. if you are using screen memory: Make sure that you use
  1169. GetPixBaseAddress(pixmap), or whatever the call is, to get the address
  1170. of the actual pixels.  (Sometimes pixmap.baseaddress is a pointer, and
  1171. sometimes a handle, depending.)  And call SetPixelsState(pixmap, LockPixels)
  1172. if you do something that might move memory after you get the address.
  1173.  
  1174. -- 
  1175.             David Palmer
  1176.             dmpalmer@clark.net
  1177.  
  1178. +++++++++++++++++++++++++++
  1179.  
  1180. >From verec@micronet.fr (Jean-Francois Brouillet)
  1181. Date: Mon, 12 Feb 1996 21:12:57 +0100
  1182. Organization: Francenet -- Paris, France
  1183.  
  1184. In article <4fldr2$aup@clark.net>, dmpalmer@clark.net (David M. Palmer) wrote:
  1185.  
  1186. >Lawson English <english@primenet.com> writes:
  1187.  
  1188. [question about mask to apply to rowBytes (0x7fff or 0x3fff)]
  1189.  
  1190. Using DejaNews, I found the following article which may explain what these
  1191. bits are used for...
  1192.  
  1193. Here's the entire article (which deals with how to retreive the palette
  1194. stored within a PICT file). The portion relevant to this thread is in the
  1195. ColorBitsProc routine...
  1196.  
  1197. hope this helps...
  1198.  
  1199.  
  1200. [BTW: I needed some thing like this, ant this code does work!]
  1201.  
  1202. sender: mars@netcom15.netcom.com
  1203. references: <marsDGGzu9.EMF@netcom.com> <466grp$3ul@crl14.crl.com>
  1204. content-type: text/plain; charset=ISO-8859-1
  1205. organization: NETCOM On-line Communication Services (408 261-4700 guest)
  1206. mime-version: 1.0
  1207. newsgroups: comp.sys.mac.programmer.help
  1208.  
  1209. In article <466grp$3ul@crl14.crl.com> John S. Heaney, heaney@crl.com
  1210. writes:
  1211. >In article <marsDGGzu9.EMF@netcom.com>, Darren Giles  <mars@netcom.com> wrote:
  1212. >>I need to get a color table out of an 8-bit PICT.  I know one way to do
  1213. >>it is to use GetPictInfo, which generates a color table based on the
  1214. >>pixels it sees in the picture...  but I need to get the original color
  1215. >>table.
  1216. >
  1217. >I've wanted to do that, too. I'm surprised that there doesn't seem to be 
  1218. >a way to do this built into the toolbox, considering all the other 
  1219. >powerful tools.
  1220.  
  1221. No kidding!  Well, I've patched together a start based on the
  1222. CollectPictColors
  1223. snippet (using the QDraw bottleneck idea, as Nicholas (and DTS)
  1224. suggested).
  1225. Here's what I've got so far, in case others are trying to do the same:
  1226.  
  1227. - Darren
  1228.  
  1229.  
  1230. CTabHandle gColorTable; /* to collect colors from bottlenecks. */
  1231.  
  1232. ///////////////////////////////////////////////////////////////////////
  1233. /////////////////
  1234. //   Looks though the PICT, returns a copy of the CLUT of the first
  1235. bitmap it encounters.
  1236. ///////////////////////////////////////////////////////////////////////
  1237. /////////////////
  1238. CTabHandle CollectColors (PicHandle fromPicture) {
  1239.         CQDProcs bottlenecks;
  1240.  
  1241.  
  1242.         if (!fromPicture) {
  1243.                 return nil;
  1244.         }
  1245.         
  1246.         /* Set the bottlenecks.  These bottlenecks will figure out what colors
  1247. are in
  1248.                 a picture, but won't draw anything.
  1249.         Note: the bottlenecks are installed in thePort, which must be a color
  1250. port.
  1251.         */
  1252.         SetStdCProcs(&bottlenecks);
  1253.         bottlenecks.textProc = nil;
  1254.         bottlenecks.lineProc = nil;
  1255.         bottlenecks.rectProc = nil;
  1256.         bottlenecks.rRectProc = nil;
  1257.         bottlenecks.ovalProc = nil;
  1258.         bottlenecks.arcProc = nil;
  1259.         bottlenecks.polyProc = nil;
  1260.         bottlenecks.rgnProc = nil;
  1261.         bottlenecks.bitsProc = NewQDBitsProc (ColorBitsProc);
  1262.  
  1263.         gColorTable= nil;
  1264.         
  1265.         /* Now play back the picture to get the colors.  The dstRect doesn't
  1266.                 matter since our bottlenecks will never actually draw. We
  1267. use global
  1268.                 variables (gColorError and gColorTable) to communicate with the
  1269.                 bottlenecks. */
  1270.         (*(qd.thePort)).grafProcs = (QDProcs *) &bottlenecks;
  1271.         DrawPicture(fromPicture, &((**fromPicture).picFrame));
  1272.         (*(qd.thePort)).grafProcs = 0L;
  1273.  
  1274.         return gColorTable;
  1275. }
  1276.  
  1277. ///////////////////////////////////////////////////////////////////////
  1278. /////////////////
  1279. pascal void ColorBitsProc(BitMap *bitPtr, Rect *srcRect, Rect *dstRect,
  1280. short mode, RgnHandle maskRgn) {
  1281. #pragma unused (srcRect, dstRect, mode, maskRgn)
  1282.         PixMapPtr               aPixMap;
  1283.         short                   tempRB;
  1284.         Handle                  CTHandle;
  1285.  
  1286.  
  1287.   /* Get the PixMap that we are about to draw.  SrcBits might be a BitMap,
  1288.    or one of two different kinds of PixMap pointers.  */
  1289.  
  1290.     tempRB = (*bitPtr).rowBytes;    /* local copy of rowBytes */
  1291.     if (tempRB & 0x8000) {          /* high bit set? */
  1292.         if (tempRB & 0x4000) {      /* next to high bit set? */
  1293.             /* ptr to PixMap handle */
  1294.             aPixMap = (** ( (PixMapHandle *)bitPtr ));    
  1295.         }
  1296.         else {
  1297.             /* pointer to a PixMap */
  1298.             aPixMap = (PixMapPtr) bitPtr;           
  1299.         }
  1300.                         
  1301.         if ((*aPixMap).pixelType==16) {
  1302.                 return;                                                         
  1303.             /* direct pixmap?  eek! */
  1304.         }
  1305.  
  1306.         if (!gColorTable) {
  1307.             CTHandle= (Handle) (*aPixMap).pmTable;
  1308.             gColorTable= (CTabHandle) NewHandle (GetHandleSize (CTHandle));
  1309.             BlockMove (*CTHandle, *gColorTable, GetHandleSize (CTHandle));
  1310.         }
  1311.     }
  1312. }
  1313.  
  1314. -- 
  1315. Jean-Francois Brouillet              verec@micronet.fr
  1316. Macintosh Software Developer     verecundus@eworld.com
  1317.  
  1318. +++++++++++++++++++++++++++
  1319.  
  1320. >From kluev@macsimum.gamma.ru (Kluev)
  1321. Date: Tue, 13 Feb 96 19:08:42 +0300
  1322. Organization: (none)
  1323.  
  1324. In article <jwbaxter-1102961032120001@ptpm022.olympus.net>,
  1325. jwbaxter@olympus.net (John W. Baxter) wrote:
  1326.  
  1327. >In article <4fl5aq$t7c@nnrp1.news.primenet.com>, Lawson English
  1328. ><english@primenet.com> wrote:
  1329. >
  1330. >>Chris De Salvo <phixus@deltanet.com> wrote:
  1331. >>[snipt]
  1332. >>:    rowBytes = (**(**theGDH).gdPMap).rowBytes & 0x7FFF;
  1333. >>
  1334. >>All the working code samples that I have uses 0x3fff, not 0x7fff.
  1335. >>
  1336. >>
  1337. >>Anyone know if it makes any difference in the real world?
  1338. >
  1339. >   I'm not sure it makes any current real-world difference.  However,
  1340. the
  1341. >value rowBytes is specified as being less than 0x4000 (IM: Imaging
  1342. with
  1343. >QuickDraw, page 4-47), and the top two bits are specified as being
  1344. used as
  1345. >flags.  No use of bit 14 is given on that page (leaving a few other IM
  1346. >pages where it might be--a check of Advanced Color Imaging would be a
  1347. good
  1348. >idea, but I can't lay hands on it in paper form right now and don't
  1349. feel
  1350. >like checking a CD version).
  1351.  
  1352. They were just too lazy to point out in IM that the *only* bit is
  1353. used to distinguish between color and b&w BitMaps, and the only case
  1354. when the *second* bit is used is when you pass PixMap as a parameter
  1355. to CopyBits procedure. The latter restriction could be bypassed via
  1356. several ways.
  1357.  
  1358. - --------------------------------------------------------------
  1359. Michael Kluev                            kluev@macsimum.gamma.ru
  1360. Macintosh Programmer                           Physics Grad, MSU
  1361. MACsimum Ltd.                                     Moscow, Russia
  1362. - --------------------------------------------------------------
  1363.  
  1364. +++++++++++++++++++++++++++
  1365.  
  1366. >From Mark Williams <Mark@streetly.demon.co.uk>
  1367. Date: Tue, 13 Feb 96 07:14:23 GMT
  1368. Organization: Streetly Software
  1369.  
  1370.  
  1371. In article <verec-1202962112570001@ppp94.micronet.fr>, Jean-Francois Brouillet writes:
  1372.  
  1373. > In article <4fldr2$aup@clark.net>, dmpalmer@clark.net (David M. Palmer) wrote:
  1374. > >Lawson English <english@primenet.com> writes:
  1375. > [question about mask to apply to rowBytes (0x7fff or 0x3fff)]
  1376. [snip]
  1377. >         SetStdCProcs(&bottlenecks);
  1378. [snip]
  1379. >         bottlenecks.bitsProc = NewQDBitsProc (ColorBitsProc);
  1380. > ///////////////////////////////////////////////////////////////////////
  1381. > /////////////////
  1382. > pascal void ColorBitsProc(BitMap *bitPtr, Rect *srcRect, Rect *dstRect,
  1383. > short mode, RgnHandle maskRgn) {
  1384. > #pragma unused (srcRect, dstRect, mode, maskRgn)
  1385. >         PixMapPtr               aPixMap;
  1386. >         short                   tempRB;
  1387. >         Handle                  CTHandle;
  1388. >   /* Get the PixMap that we are about to draw.  SrcBits might be a BitMap,
  1389. >    or one of two different kinds of PixMap pointers.  */
  1390. >     tempRB = (*bitPtr).rowBytes;    /* local copy of rowBytes */
  1391. >     if (tempRB & 0x8000) {          /* high bit set? */
  1392. >         if (tempRB & 0x4000) {      /* next to high bit set? */
  1393. >             /* ptr to PixMap handle */
  1394. >             aPixMap = (** ( (PixMapHandle *)bitPtr ));    
  1395. >         }
  1396. >         else {
  1397. >             /* pointer to a PixMap */
  1398. >             aPixMap = (PixMapPtr) bitPtr;           
  1399. >         }
  1400. >                         
  1401. >         if ((*aPixMap).pixelType==16) {
  1402. >                 return;                                                         
  1403. >             /* direct pixmap?  eek! */
  1404. >         }
  1405. >         if (!gColorTable) {
  1406. >             CTHandle= (Handle) (*aPixMap).pmTable;
  1407. >             gColorTable= (CTabHandle) NewHandle (GetHandleSize (CTHandle));
  1408. >             BlockMove (*CTHandle, *gColorTable, GetHandleSize (CTHandle));
  1409. >         }
  1410. >     }
  1411. > }
  1412.  
  1413. The "if (tempRB & 0x4000)" line will always be false. CopyBits looks at that bit and if its set it 
  1414. dereferences the pixmap _before_ calling the bottleneck bitsProc (oh, and by the way it doesnt HLock 
  1415. the PixMapHandle first either, so on entry bitPtr could be a pointer to an unlocked, dereferenced 
  1416. PixMap).
  1417.  
  1418. This means that if you call StdBits rather than copybits, you can use a rowbytes value of up to 
  1419. 0x7fff (This was documented once in a technote I think, but is probably unsupported).
  1420.  
  1421. - --------------------------------------
  1422. Mark Williams<Mark@streetly.demon.co.uk>
  1423.  
  1424. +++++++++++++++++++++++++++
  1425.  
  1426. >From dbrosius@chesco.com (Dave M Brosius)
  1427. Date: 17 Feb 1996 07:52:34 GMT
  1428. Organization: Chester County Internet Services, Inc.
  1429.  
  1430. In article <4fl5aq$t7c@nnrp1.news.primenet.com>, Lawson English
  1431. <english@primenet.com> wrote:
  1432.  
  1433. > Chris De Salvo <phixus@deltanet.com> wrote:
  1434. > [snipt]
  1435. > :    rowBytes = (**(**theGDH).gdPMap).rowBytes & 0x7FFF;
  1436. > All the working code samples that I have uses 0x3fff, not 0x7fff.
  1437. > Anyone know if it makes any difference in the real world?
  1438.  
  1439. Yes!
  1440.  
  1441. use 0x3FFF...
  1442.  
  1443. I think bit 14 means that no color table mapping occurs... ie source
  1444. pixmaps are drawn using the color indexes of the gworlds pixmap.
  1445.  
  1446. -- 
  1447. Please reply via email as well
  1448. dave dbrosius@chesco.com
  1449.  
  1450. +++++++++++++++++++++++++++
  1451.  
  1452. >From sw@nan.co.uk (Sak Wathanasin)
  1453. Date: Sat, 17 Feb 1996 14:35:23 GMT
  1454. Organization: Network Analysis Ltd
  1455.  
  1456. In article <96021307142300261@streetly.demon.co.uk>,
  1457. Mark@streetly.demon.co.uk wrote:
  1458.  
  1459. > This means that if you call StdBits rather than copybits, you can use a
  1460. > rowbytes value of up to 0x7fff (This was documented once in a technote I
  1461. > think, but is probably unsupported).
  1462.  
  1463. As an aside, QD will cheerfully let you create pixmaps whose rowBytes are
  1464. longer than 0x3fff, but will, er, "behave strangely" you attempt to
  1465. CopyBits from such a pixmap. It does seem to let one CopyBits to such a
  1466. pixmap though. It's quite easy to generate such a pixmap in PhotoShop: I
  1467. was downsampling Scitex CT files, and by mistake the test file that I made
  1468. with Photoshop was 72 dpi instead of the 300 dpi that I had intended, and
  1469. it killed my appl. I've fixed it now, but it took me ages to work out what
  1470. was going on...
  1471.  
  1472. -- 
  1473. Sak Wathanasin
  1474. Network Analysis Limited
  1475. 178 Wainbody Ave South, Coventry CV3 6BX, UK
  1476.  
  1477. Internet: sw@nan.co.uk 
  1478. uucp:     ...!britain.eu.net!nan!sw
  1479. Phone: (+44) 1203 419996                              Fax: (+44) 1203 690690
  1480.  
  1481. +++++++++++++++++++++++++++
  1482.  
  1483. >From sw@network-analysis-ltd.co.uk (Sak Wathanasin)
  1484. Date: Sun, 18 Feb 1996 13:22:16 GMT
  1485. Organization: Network Analysis Ltd
  1486.  
  1487. In article <jwbaxter-1102961032120001@ptpm022.olympus.net>,
  1488. jwbaxter@olympus.net (John W. Baxter) wrote:
  1489.  
  1490. >    I'm not sure it makes any current real-world difference.  However, the
  1491. > value rowBytes is specified as being less than 0x4000 (IM: Imaging with
  1492. > QuickDraw, page 4-47), and the top two bits are specified as being used as
  1493. > flags.  No use of bit 14 is given on that page (leaving a few other IM
  1494.  
  1495. Doesn't CopyBits use it to tell whether you've called LockPixels on the
  1496. pixmap? Can't remember where I saw this though, so it might be a figment
  1497. of my imagination...
  1498.  
  1499. -- 
  1500. Sak Wathanasin
  1501. Network Analysis Limited
  1502. 178 Wainbody Ave South, Coventry CV3 6BX, UK
  1503.  
  1504. Internet: sw@nan.co.uk 
  1505. uucp:     ...!britain.eu.net!nan!sw
  1506. Phone: (+44) 1203 419996                              Fax: (+44) 1203 690690
  1507.  
  1508. +++++++++++++++++++++++++++
  1509.  
  1510. >From matt@lantic.idiscover.co.uk (Matt Gough)
  1511. Date: Sat, 17 Feb 1996 21:23:09 +0000
  1512. Organization: Internet Discovery Ltd
  1513.  
  1514. >
  1515. >I think bit 14 means that no color table mapping occurs... ie source
  1516. >pixmaps are drawn using the color indexes of the gworlds pixmap.
  1517. >
  1518.  
  1519. Bit 14 tells Qd internally that the pixmap was created for a GWorld, and
  1520. that it has to RecoverHandle on the baseAddr to get the real pixmap data.
  1521.  
  1522. Matt Gough
  1523.  
  1524. +++++++++++++++++++++++++++
  1525.  
  1526. >From kluev@macsimum.gamma.ru (Kluev)
  1527. Date: Mon, 19 Feb 96 18:17:05 +0300
  1528. Organization: (none)
  1529.  
  1530. In article <dbrosius-1702960213070001@pm1x20.chesco.com>,
  1531. dbrosius@chesco.com (Dave M Brosius) wrote:
  1532.  
  1533. >I think bit 14 means that no color table mapping occurs... ie source
  1534. >pixmaps are drawn using the color indexes of the gworlds pixmap.
  1535.  
  1536.  
  1537. In article <matt-1702962123090001@lantic.idiscover.co.uk>,
  1538. matt@lantic.idiscover.co.uk (Matt Gough) wrote:
  1539.  
  1540. >Bit 14 tells Qd internally that the pixmap was created for a GWorld,
  1541. and
  1542. >that it has to RecoverHandle on the baseAddr to get the real pixmap
  1543. data.
  1544.  
  1545.  
  1546. People, please stop this mess. Bit 14 in rowBytes has nothing to do
  1547. with color-remapping blocking (ctFlags field of color table does it),
  1548. nor with the state of baseAddr block (pmVersion field of PixMap does
  1549. it).
  1550. RowBytes' bit 14 is only getting used within CopyBits call to
  1551. distinguish between color grafports and bitmaps/pixmaps.
  1552.  
  1553. BTW, among the list of groups:
  1554. comp.sys.mac.graphics, comp.sys.mac.programmer.help,
  1555. comp.sys.mac.programmer.games, comp.sys.mac.programmer.tools,
  1556. comp.sys.mac.programmer.codewarrior
  1557.  
  1558. only comp.sys.mac.programmer.help has to do with the question.
  1559. So I removed other groups from news-header.
  1560.  
  1561. - --------------------------------------------------------------
  1562. Michael Kluev                            kluev@macsimum.gamma.ru
  1563. Macintosh Programmer                           Physics Grad, MSU
  1564. MACsimum Ltd.                                     Moscow, Russia
  1565. - --------------------------------------------------------------
  1566.  
  1567. ---------------------------
  1568.  
  1569. >From nolanw@iglou.com (Nolan W. Whitaker)
  1570. Subject: PEF (Preferred Executable Format) Info Needed
  1571. Date: Sun, 11 Feb 1996 01:53:07 GMT
  1572. Organization: IgLou Internet Services (1-800-436-4456)
  1573.  
  1574. I have been desperately searching for documentation on the
  1575. Preferred Executable Format used for binary files on the Mac
  1576. and the BeBox.  
  1577.  
  1578. I assumed that Inside Macintosh would document this thoroughly,
  1579. but the only reference I could find on my Inside Mac CD was a
  1580. brief note in the PowerPC Systems book that stated essentially
  1581. that Macs use PEF--- but no explanation or examples of the
  1582. format.
  1583.  
  1584. I've also searched the Web using a couple of different search
  1585. engines without finding anything useful.
  1586.  
  1587. I will be beginning a project for the BeBox very soon where I'll
  1588. need to produce an executable file, but in order to due that
  1589. I need to find a detailed explanation of the file format.
  1590.  
  1591. Any ideas?  Is this info available on any of the Apple developer 
  1592. CDs?  A book?
  1593.  
  1594.  
  1595. Thanks,
  1596. Nolan
  1597.  
  1598.  
  1599. ======================================================================
  1600. =  nolanw@iglou.com          ||                                      =
  1601. =  nolanw@ewl.uky.edu        ||     http://www.ewl.uky.edu/~nolanw   =
  1602. ======================================================================
  1603. = ...waiting on that BeBox I ordered to arrive...                    =
  1604. ======================================================================
  1605.  
  1606.  
  1607. +++++++++++++++++++++++++++
  1608.  
  1609. >From fnf@fishpond.amigalib.com (Fred Fish)
  1610. Date: 13 Feb 1996 17:53:42 GMT
  1611. Organization: Cronus
  1612.  
  1613. In article <eric.kidd-1302961134120001@atgw-kip-1-141.dartmouth.edu>,
  1614. Eric M. Kidd <eric.kidd@dartmouth.edu> wrote:
  1615. >It seems, according to statements from MWRon, that PEF is a fairly
  1616. >well-guarded Apple patent, with licensing agreements and whatnot. This
  1617. >brings up a couple of issues.
  1618.  
  1619. What is the patent number please.
  1620.  
  1621. >   * How are folks supposed to make GNU tools work on the PowerMac?
  1622.  
  1623. My understanding is that the MacOS loads XCOFF as well as PEF, and
  1624. that the current port of gcc to MacOS generates XCOFF executables.
  1625.  
  1626. >   * How are folks supposed to make GNU tools work on the BeBox?
  1627.  
  1628. There are a number of possibilities for getting a gcc port that just
  1629. compiles posix type apps (getting a full g++ port for doing Be
  1630. specific things is much harder):
  1631.  
  1632. (1)    Add PEF support to the BFD library so that the linker
  1633.     can generate PEF executables.  Note that it isn't necessary
  1634.     that the intermediate object files be PEF, though that would
  1635.     probably not be much more work to implement.  This will require
  1636.     either having Apple become more open about supplying documentation
  1637.     on PEF without restriction, or reverse engineering the PEF format.
  1638.     I have a document that was written by someone who did just that,
  1639.     but I don't know how complete it is, with regards to being suitable
  1640.     for adding PEF support to the BFD library.
  1641.  
  1642. (2)    Use an XCOFF (or ELF) to PEF translator to convert the output
  1643.     of the linker to PEF format.  For maximum compatibility this would
  1644.     have to be done by someone with access to the PEF documentation
  1645.     under NDA.  They could then distribute BeOS binaries or possibly
  1646.     other binaries like linux, for those that are interested in
  1647.     initially building GNU cross environments to help in bootstrapping
  1648.     all the utilities to BeOS.  One problem here is that we would need 
  1649.     a reverse PEF to XCOFF translator to generate BeOS libraries 
  1650.     that the GNU linker can use.  Aside from being somewhat of
  1651.     a kludge, it this solution doesn't help for things like gdb
  1652.     ports, where the program has to be able to read the native
  1653.     executable format unless you want to keep both the XCOFF and
  1654.     PEF versions of each executable and attach to the running
  1655.     PEF version while reading symbols and such out of the XCOFF
  1656.     version.
  1657.  
  1658. (3)    Have gcc produce assembly files that are then fed to the
  1659.     current Metroworks tools for assembly and linkage.  This is
  1660.     somewhat how early SVR4 gcc ports worked before the GNU tools
  1661.     fully supported ELF format.
  1662.  
  1663. (4)    If you just want ports of "GNU tools" but not necessarily
  1664.     gcc, then use the existing tools to build the GNU tools, as
  1665.     many people are already doing.  Ideally the posix environment
  1666.     on BeOS needs to be as complete as possible, and this is
  1667.     currently being worked on AFAIK.  Simple things already work,
  1668.     and some tools like sed compile almost unchanged.  However
  1669.     other tools that depend heavily on things like signals,
  1670.     fork/exec, etc will take much more work with the current
  1671.     release.
  1672.  
  1673. (5)    There must be at least a couple other solutions :-)
  1674.  
  1675. -Fred
  1676. -- 
  1677. CRONUS  --  1840 E. Warner Road #105-265  --  Tempe, AZ 85284  --  USA
  1678. Voice:  (800) 804-0833  or  (602) 491-0442        FAX:  (602) 491-0048
  1679. Email:  info@amigalib.com  or  info@ninemoons.com (coming soon)
  1680. Ftp site: ftp.amigalib.com  or  ftp.ninemoons.com (coming soon)
  1681.  
  1682. +++++++++++++++++++++++++++
  1683.  
  1684. >From ck@be.com (C.K. Haun)
  1685. Date: Tue, 13 Feb 1996 11:38:47 -0800
  1686. Organization: Be, Inc.
  1687.  
  1688. In article <DML8rA.M19@iglou.com>, nolanw@iglou.com (Nolan W. Whitaker) wrote:
  1689. > I have been desperately searching for documentation on the
  1690. > Preferred Executable Format used for binary files on the Mac
  1691. The PEF format is proprietary to Apple and IBM, we are using it under
  1692. license from Apple.  
  1693. It's not documented anywhere, except for some freeware documentation that
  1694. someone reverse-engineered and posted here and there (I actually don't
  1695. know where) and even that is not complete.
  1696. Tools developers can license the format information from Apple, and when
  1697. we finalized our licensing agreement with Apple we will be able to
  1698. sub-license to our developers.
  1699.  
  1700. Why is it so secret?  Dont' really know, but it's the rules we have to play by.
  1701.  
  1702. C.K. Haun <TR>
  1703. The Developer Guy @ Be, Inc.                 ck@be.com
  1704.                           The Mild Bunch
  1705. 1996 Royal Star 1300    1991 Voyager 1200    1990 Virago 750
  1706. 1993 Virago 535         1987 Reflex 225      <maybe a Valkirie soon?>
  1707.  
  1708. +++++++++++++++++++++++++++
  1709.  
  1710. >From eric.kidd@dartmouth.edu (Eric M. Kidd)
  1711. Date: Tue, 13 Feb 1996 11:34:12 -0500
  1712. Organization: Dartmouth College
  1713.  
  1714. In article <DML8rA.M19@iglou.com>, nolanw@iglou.com (Nolan W. Whitaker) wrote:
  1715.  
  1716. > I have been desperately searching for documentation on the
  1717. > Preferred Executable Format used for binary files on the Mac
  1718. > and the BeBox.  
  1719. > I assumed that Inside Macintosh would document this thoroughly,
  1720. > but the only reference I could find on my Inside Mac CD was a
  1721. > brief note in the PowerPC Systems book that stated essentially
  1722. > that Macs use PEF--- but no explanation or examples of the
  1723. > format.
  1724.  
  1725. It seems, according to statements from MWRon, that PEF is a fairly
  1726. well-guarded Apple patent, with licensing agreements and whatnot. This
  1727. brings up a couple of issues.
  1728.  
  1729.    * How are folks supposed to make GNU tools work on the PowerMac?
  1730.    * How are folks supposed to make GNU tools work on the BeBox?
  1731.  
  1732. Just wondering. =)
  1733.  
  1734. (This article is cross-posted, by the way. Please reset followups if it's
  1735. about to get off topic in either newsgroup.)
  1736.  
  1737. Cheers,
  1738. Eric
  1739.  
  1740. ........................................................................
  1741. Eric Kidd (eric.kidd@dartmouth.edu)      http://coos.dartmouth.edu/~emk/
  1742. "Computers are useless.  They can only give you answers." -Pablo Picasso
  1743.  
  1744. +++++++++++++++++++++++++++
  1745.  
  1746. >From fnf@fishpond.amigalib.com (Fred Fish)
  1747. Date: 13 Feb 1996 20:18:37 GMT
  1748. Organization: Cronus
  1749.  
  1750. In article <ck-1302961138470001@freud.be.com>, C.K. Haun <ck@be.com> wrote:
  1751. >In article <DML8rA.M19@iglou.com>, nolanw@iglou.com (Nolan W. Whitaker) wrote:
  1752. >Tools developers can license the format information from Apple, and when
  1753. >we finalized our licensing agreement with Apple we will be able to
  1754. >sub-license to our developers.
  1755.  
  1756. Neither of these will help the people wanting to provide support for
  1757. GNU tools on the BeBox unless the licensing explicitly allows
  1758. releasing source code that makes use of information provided under the
  1759. license agreement.
  1760.  
  1761. -Fred
  1762.  
  1763. -- 
  1764. CRONUS  --  1840 E. Warner Road #105-265  --  Tempe, AZ 85284  --  USA
  1765. Voice:  (800) 804-0833  or  (602) 491-0442        FAX:  (602) 491-0048
  1766. Email:  info@amigalib.com  or  info@ninemoons.com (coming soon)
  1767. Ftp site: ftp.amigalib.com  or  ftp.ninemoons.com (coming soon)
  1768.  
  1769. +++++++++++++++++++++++++++
  1770.  
  1771. >From d88-bli@xbyse.nada.kth.se (Bo Lindbergh)
  1772. Date: 14 Feb 1996 01:01:43 GMT
  1773. Organization: Royal Institute of Technology, Stockholm, Sweden
  1774.  
  1775. In article <4fqj76$f20@globe.indirect.com> fnf@fishpond.amigalib.com (Fred Fish) writes:
  1776. ) My understanding is that the MacOS loads XCOFF as well as PEF, and
  1777. ) that the current port of gcc to MacOS generates XCOFF executables.
  1778.  
  1779. I can't get it to load an XCOFF executable, but there may be some magic
  1780. incantation needed that I'm unaware of.
  1781.  
  1782. ) (1)    Add PEF support to the BFD library so that the linker
  1783. )     can generate PEF executables.  Note that it isn't necessary
  1784. )     that the intermediate object files be PEF, though that would
  1785. )     probably not be much more work to implement.
  1786.  
  1787. PEF is not suitable for intermediate object files.
  1788.  
  1789.  
  1790. /Bo Lindbergh
  1791.  
  1792. +++++++++++++++++++++++++++
  1793.  
  1794. >From jayfar@netaxs.com (Jay Farrell)
  1795. Date: Wed, 14 Feb 1996 00:32:11 -0500
  1796. Organization: Jayfar's Web
  1797.  
  1798. In article <4fqrmt$i9h@globe.indirect.com>, fnf@fishpond.amigalib.com
  1799. (Fred Fish) wrote:
  1800.  
  1801. > In article <ck-1302961138470001@freud.be.com>, C.K. Haun <ck@be.com> wrote:
  1802. > >In article <DML8rA.M19@iglou.com>, nolanw@iglou.com (Nolan W. Whitaker)
  1803. wrote:
  1804. > >Tools developers can license the format information from Apple, and when
  1805. > >we finalized our licensing agreement with Apple we will be able to
  1806. > >sub-license to our developers.
  1807. > Neither of these will help the people wanting to provide support for
  1808. > GNU tools on the BeBox unless the licensing explicitly allows
  1809. > releasing source code that makes use of information provided under the
  1810. > license agreement.
  1811.  
  1812. Damn.  Is this yet another instance of Apple leaving P.D. language
  1813. developers out in the cold?
  1814.  
  1815. This same sort of situation appears to exist with OpenDoc.  Although
  1816. Apple's OpenDoc Programmers Guide states that OpenDoc parts can be written
  1817. in any language, there are no IDL emitters to accommodate this AFAIK.
  1818.  
  1819. Bring back Wozniak and put him in charge of R&D -- he'd kill all this secrecy.
  1820.  
  1821. Cheers,
  1822. Jayfar
  1823.  
  1824.    /////////////////////////////////////////////////////////////////////////////
  1825.   ////// The Mops Page    <URL:http://www.netaxs.com/~jayfar/mops.html>  //////
  1826.  /////////////////////////////////////////////////////////////////////////////
  1827.  Jay Farrell
  1828.  jayfar@netaxs.com                       <URL:http://www.netaxs.com/~jayfar/>
  1829.  Philadelphia, Pennsylvania, USA           Jayfar's Virtual Mac FTP Site
  1830.  
  1831. +++++++++++++++++++++++++++
  1832.  
  1833. >From nolanw@iglou.com (Nolan W. Whitaker)
  1834. Date: Wed, 14 Feb 1996 15:59:28 GMT
  1835. Organization: IgLou Internet Services (1-800-436-4456)
  1836.  
  1837. fnf@fishpond.amigalib.com (Fred Fish) wrote:
  1838.  
  1839. >There are a number of possibilities for getting a gcc port that just
  1840. >compiles posix type apps (getting a full g++ port for doing Be
  1841. >specific things is much harder):
  1842.  
  1843. ...misc deleted
  1844.  
  1845. >(3)    Have gcc produce assembly files that are then fed to the
  1846. >    current Metroworks tools for assembly and linkage.  This is
  1847. >    somewhat how early SVR4 gcc ports worked before the GNU tools
  1848. >    fully supported ELF format.
  1849.  
  1850.  
  1851. This is essentially what I think I'll be doing with at least one 
  1852. of my projects.  As long as Be continues shipping a copy of the
  1853. Metrowerks stuff with every machine and they don't change 
  1854. things too much, I think I'll be reasonably ok.
  1855.  
  1856. Thanks for all the info guys!
  1857. -Nolan
  1858.  
  1859.  
  1860. ======================================================================
  1861. =  nolanw@iglou.com          ||                                      =
  1862. =  nolanw@ewl.uky.edu        ||     http://www.ewl.uky.edu/~nolanw   =
  1863. ======================================================================
  1864. = ...waiting on that BeBox I ordered to arrive...                    =
  1865. ======================================================================
  1866.  
  1867.  
  1868. +++++++++++++++++++++++++++
  1869.  
  1870. >From fnf@fishpond.amigalib.com (Fred Fish)
  1871. Date: 14 Feb 1996 16:05:45 GMT
  1872. Organization: Cronus
  1873.  
  1874. In article <4frc9n$5eq@news.kth.se>,
  1875. Bo Lindbergh <d88-bli@xbyse.nada.kth.se> wrote:
  1876. >
  1877. >PEF is not suitable for intermediate object files.
  1878.  
  1879. Now that's interesting!  I haven't examined the meager documentation I
  1880. have on PEF yet in any detail, so I wasn't aware of that.  I just
  1881. assumed that since it was an XCOFF derivative, which is typically used
  1882. for both the object and executable format, that it was the same for
  1883. PEF.
  1884.  
  1885. So that leads up to the question, what *is* the object file format
  1886. that the MetroWerks compiler uses?  Does this mean that if anyone
  1887. wants to produce a fully compatible set of GNU tools that they not
  1888. only have to deal with an undocumented object file format, they also
  1889. have to deal with a (different) undocumented object file format and an
  1890. undocumented library format?
  1891.  
  1892. Gee, standard ELF objects/executables and standard unix style "ar"
  1893. archives are sure starting to sound like a more appropriate longterm
  1894. solution for what is being promoted as a hackers machine.  :-)
  1895.  
  1896. -Fred
  1897. -- 
  1898. CRONUS  --  1840 E. Warner Road #105-265  --  Tempe, AZ 85284  --  USA
  1899. Voice:  (800) 804-0833  or  (602) 491-0442        FAX:  (602) 491-0048
  1900. Email:  info@amigalib.com  or  info@ninemoons.com (coming soon)
  1901. Ftp site: ftp.amigalib.com  or  ftp.ninemoons.com (coming soon)
  1902.  
  1903. +++++++++++++++++++++++++++
  1904.  
  1905. >From triquet@supelec.fr (Benoit Triquet)
  1906. Date: 14 Feb 1996 22:13:12 GMT
  1907. Organization: SUPELEC
  1908.  
  1909. Fred Fish (fnf@fishpond.amigalib.com) wrote:
  1910. : So that leads up to the question, what *is* the object file format
  1911. : that the MetroWerks compiler uses?  Does this mean that if anyone
  1912. : wants to produce a fully compatible set of GNU tools that they not
  1913. : only have to deal with an undocumented object file format, they also
  1914. : have to deal with a (different) undocumented object file format and an
  1915. : undocumented library format?
  1916.  
  1917. hd (/bin/hd on the bebox, hex dump) any .o file. you read MWOBPPC
  1918. *WIN* the object format is a metrowerks thing.
  1919. This story with PEF is becoming unpleasant... Our hacker open minded $50
  1920. licensing machine has it in the...
  1921. Hey btw, JLG, how do you intend to deal with PEF in the $50 license fee for
  1922. the BeOS ??
  1923.  
  1924. Benoit
  1925.  
  1926. +++++++++++++++++++++++++++
  1927.  
  1928. >From aek@goonsquad.spies.com (Al Kossow)
  1929. Date: 14 Feb 1996 17:49:21 -0800
  1930. Organization: Internet Wiretap
  1931.  
  1932. >From article <4ftmpo$4vo@prof.ese-metz.fr>, by triquet@supelec.fr (Benoit Triquet):
  1933. > Hey btw, JLG, how do you intend to deal with PEF in the $50 license fee for
  1934. > the BeOS ??
  1935.  
  1936. Has anyone tried contacting Apple about dropping the PEF license? I would think
  1937. now would be a good time to try, given the current push to open up other parts
  1938. of the system. 
  1939.  
  1940.  
  1941. +++++++++++++++++++++++++++
  1942.  
  1943. >From Mike Griebling <grieblm@es2>
  1944. Date: 15 Feb 1996 12:10:47 GMT
  1945. Organization: AlliedSignal Engines, Phoenix, Az
  1946.  
  1947. Fred Fish writes:
  1948.  
  1949. > In article <4frc9n$5eq@news.kth.se>,
  1950. > Bo Lindbergh <d88-bli@xbyse.nada.kth.se> wrote:
  1951. > >
  1952. > >PEF is not suitable for intermediate object files.
  1953. > So that leads up to the question, what *is* the object file format
  1954. > that the MetroWerks compiler uses?  Does this mean that if anyone
  1955. > wants to produce a fully compatible set of GNU tools that they not
  1956. > only have to deal with an undocumented object file format, they also
  1957. > have to deal with a (different) undocumented object file format and an
  1958. > undocumented library format?
  1959.  
  1960. Good question!  Anyone at Be care to comment?
  1961.  
  1962. > Gee, standard ELF objects/executables and standard unix style "ar"
  1963. > archives are sure starting to sound like a more appropriate longterm
  1964. > solution for what is being promoted as a hackers machine.  :-)
  1965.  
  1966. I agree 100%!
  1967.  
  1968. > -Fred
  1969.  
  1970.  
  1971. Regards,
  1972.     Michael
  1973. - ------------------------------------------------------------
  1974. Michael Griebling, P. Eng.        mgriebling@bix.com
  1975. Computer Inspirations            grieblm@trt.allied.com
  1976.  
  1977.  
  1978. +++++++++++++++++++++++++++
  1979.  
  1980. >From hplus@bga.com (Jon Watte)
  1981. Date: Thu, 15 Feb 1996 19:16:47 -0600
  1982. Organization: Rudimentary
  1983.  
  1984.  
  1985. In article <4ft18p$da7@globe.indirect.com>,
  1986. fnf@fishpond.amigalib.com (Fred Fish) wrote:
  1987.  
  1988. > assumed that since it was an XCOFF derivative, which is typically used
  1989. > for both the object and executable format, that it was the same for
  1990. > PEF.
  1991.  
  1992. PEF was invented by Apple because it is SUBSTANTIALLY more compact than
  1993. XCOFF. Part of what makes it compact is the patented relocation mechanism.
  1994. Part is all the "unnecessary" stuff they left out...
  1995.  
  1996. However, PEF is still pretty flexible; you might for instance add some kind
  1997. of external data (like application resources) to a PEF section without
  1998. breaking tools that don't know about this special section.
  1999.  
  2000. > So that leads up to the question, what *is* the object file format
  2001. > that the MetroWerks compiler uses?  Does this mean that if anyone
  2002.  
  2003. The file type is "MPLF" which stands for the Metrowerks Preferred Link
  2004. Format. It is geared towards supporting features of our development tools
  2005. such as fast linking and good symbolics support. However, as we strive to
  2006. improve the performance of our tools, we may change this format, even
  2007. though it's been still for a long time now. What HAS changed is the
  2008. requirements for runtime support glue, that's why some older libraries will
  2009. not link with newly compiled applications.
  2010.  
  2011. > wants to produce a fully compatible set of GNU tools that they not
  2012. > only have to deal with an undocumented object file format, they also
  2013. > have to deal with a (different) undocumented object file format and an
  2014. > undocumented library format?
  2015.  
  2016. If you're serious, we will most definately talk to you. We are working
  2017. closely with several vendors on the Mac side who write compiler plug-ins
  2018. for the IDE. Please talk to me in e-mail and I will forward your request if
  2019. needed.
  2020.  
  2021. Cheers,
  2022.  
  2023.                             / h+
  2024.  
  2025.  
  2026. --
  2027.  Jon Watte, Austin, TX
  2028.  Play: hplus@realtime.net; Work: h+@metrowerks.com
  2029.  
  2030.  "It's a joke, dammit!"
  2031.  
  2032.  
  2033. +++++++++++++++++++++++++++
  2034.  
  2035. >From mike_duigou@fwb.com (Mike Duigou)
  2036. Date: Sun, 18 Feb 1996 14:33:37 -0800
  2037. Organization: FWB Inc.
  2038.  
  2039. In article <jayfar-1402960032110001@downtown1-36.slip.netaxs.com>,
  2040. jayfar@netaxs.com (Jay Farrell) wrote:
  2041.  
  2042. ...
  2043. >
  2044. >Damn.  Is this yet another instance of Apple leaving P.D. language
  2045. >developers out in the cold?
  2046. >
  2047. >This same sort of situation appears to exist with OpenDoc.  Although
  2048. >Apple's OpenDoc Programmers Guide states that OpenDoc parts can be written
  2049. >in any language, there are no IDL emitters to accommodate this AFAIK.
  2050. >
  2051. >Bring back Wozniak and put him in charge of R&D -- he'd kill all this secrecy.
  2052. >
  2053. ...
  2054.  
  2055. It occurs to me that most of this discussion is continuing on the basis of
  2056. inuendo, rumor and suspicion, and not a whole lot on facts. Has anyone
  2057. actually contacted Apple liscencing? I have yet to see anyone quote
  2058. coorespondance from an Apple response which confirms or denys the alleged
  2059. behaviour. One would assume that their respone would be the only thing
  2060. that matters. Incidentally you can contact Apple liscencing at :
  2061.  
  2062.    mailto:sw.license@applelink.apple.com
  2063.    http://dev.info.apple.com/swl/swl.html
  2064.  
  2065. Come on, this issue has been going on for weeks on the various Mac
  2066. programming news groups with no new information being injected into the
  2067. discussion. The general impression left is that its just a bunch of crabby
  2068. malcontents bitching about Apple and the supposed subject matter (PEF file
  2069. format) is not really the issue.
  2070.  
  2071. Mike Duigou
  2072. FWB Inc.
  2073. -- 
  2074. "Me, when I have nothing to say, my lips are sealed." -- Talking Heads
  2075.  
  2076. ---------------------------
  2077.  
  2078. >From phoebel@nanaimo.island.net (Peter Hoebel)
  2079. Subject: Reconnecting Mounted Appleshare Volumes
  2080. Date: 20 Feb 1996 05:58:20 GMT
  2081. Organization: Teranet IA Inc
  2082.  
  2083.     Greetings.
  2084.  
  2085.     I've got three related network issues I need help with.  The first two 
  2086. are of a lower priority.  The situation is this.  In an appletalk zone one 
  2087. Mac mounts four other Macs.  When one of these four shuts down the 
  2088. first mac displays the usual "the server ... has been unexpectedly 
  2089. shutdown at ..." dialog.  Our application on the first Mac regularly 
  2090. copies files from the four mounted Macs.  We're running 7.5.1.
  2091.  
  2092. 1) Is there anyway to disable this message from even 
  2093. appearing or automatically emulating a return key being pressed if it is 
  2094. displayed?
  2095.  
  2096. 2) Is there anyway to change the default timeout time, it's approximately 
  2097. 2 minutes in our LAN?
  2098.  
  2099. 3)  The initial mac needs to reconnect to the shutdown mac after it 
  2100. restarts which we're assuming is almost right away.
  2101.  
  2102. This third question is the most important one.
  2103. I believe one approach would be to resolve an alias to the volume, such 
  2104. as is stored in recent servers.  More complicated would be to store an alias 
  2105. record of the volume when it first is mounted and then resolve it after 
  2106. it has rebooted.  Is there anyway to reconnect without having to manage 
  2107. an alias in our code?
  2108.  
  2109. Any guidance would be most welcome.
  2110.  
  2111.                 Many thanks,
  2112.                     Pete Hoebel
  2113.                 
  2114.                 phoebel@epaus.island.net
  2115.  
  2116.  
  2117.  
  2118. +++++++++++++++++++++++++++
  2119.  
  2120. >From jumplong@aol.com (Jump Long)
  2121. Date: 20 Feb 1996 02:59:20 -0500
  2122. Organization: America Online, Inc. (1-800-827-6364)
  2123.  
  2124. > I've got three related network issues I need help with.  The
  2125. >first two  are of a lower priority.  The situation is this.  In
  2126. >an appletalk zone one  Mac mounts four other Macs.  When one of
  2127. >these four shuts down the  first mac displays the usual "the
  2128. >server ... has been unexpectedly  shutdown at ..." dialog.  Our
  2129. >application on the first Mac regularly  copies files from the
  2130. >four mounted Macs.  We're running 7.5.1.
  2131. >
  2132. >1) Is there anyway to disable this message from even  appearing
  2133. >or automatically emulating a return key being pressed if it is 
  2134. >displayed?
  2135.  
  2136. Get the AppleShareSetup control panel from Apple (I wrote it). It lets you
  2137. disable some or all of the dialogs the AppleShare client puts up. Or, you
  2138. can let them come up, but time out after a specified amount of time.
  2139. AppleShareSetup is available on most major online services and from
  2140. Apple's ftp server.
  2141.  
  2142. >2) Is there anyway to change the default timeout time, it's
  2143. >approximately  2 minutes in our LAN?
  2144.  
  2145. There's really no good way to change that. The time-out is handled by the
  2146. .XPP driver's ASP/AFP protocol stack and the ASP specification says the
  2147. time-out for sessions is two minutes.
  2148.  
  2149. I guess you could use PConfirmName to see if the server is still
  2150. responding to directed NBP lookups and if it doesn't respond within a
  2151. certain amount of time, you could kill the ASP session with
  2152. ASPCloseSession. I wrote a Macintosh Tech Note that tells how to get the
  2153. AFP/ASP session reference number a few years ago. You should be able to
  2154. find it in the Network Tech Notes at
  2155. <http://dev.info.apple.com/technotes/Archive/Main_archive.html>. This
  2156. technique is rather rude though.
  2157.  
  2158. >3)  The initial mac needs to reconnect to the shutdown mac after
  2159. >it  restarts which we're assuming is almost right away.
  2160.  
  2161. You can reconnect by either resolving an alias to the server, or by using
  2162. the File Manager's PBVolumeMount function. You'll have to take care of
  2163. that from your own code.
  2164.  
  2165. - Jim Luther
  2166.  
  2167. ---------------------------
  2168.  
  2169. >From 'Digital Dave' Shields <digidave@best.com>
  2170. Subject: Stuck in a bottleneck
  2171. Date: Sun, 11 Feb 1996 21:56:16 -0800
  2172. Organization: Vanguard Vision Studios, San Francisco, CA
  2173.  
  2174. I have created some special PICT files with data stored in each file's 
  2175. Pic Comment field. In order to parse the data, I have installed a 
  2176. CQDProc bottleneck procedure in my code. The procedure is being called 
  2177. fine.
  2178.  
  2179. My problem is the bottleneck procedure needs to communicate with the 
  2180. rest of the code by setting application globals. The bottleneck 
  2181. procedure is a callBack routine, and I don't have access to application 
  2182. globals without setting up and restoring the A4 register (under Think C 
  2183. it's A4 not A5).
  2184.  
  2185. Since the bottleneck procedure doesn't include a reference constant 
  2186. field as one of its arguments, I cannot pass the address of the 
  2187. application's A4 to the bottleneck proc in order to do this.
  2188.  
  2189. Any suggestions?
  2190.  
  2191. --Dave
  2192.  
  2193. +++++++++++++++++++++++++++
  2194.  
  2195. >From monhacker@aol.com (MonHacker)
  2196. Date: 12 Feb 1996 13:12:24 -0500
  2197. Organization: America Online, Inc. (1-800-827-6364)
  2198.  
  2199.  
  2200. <<
  2201. Any suggestions?
  2202. >>
  2203.  
  2204. Have you considered making your own OS queue?
  2205.  
  2206. Bob Boylan
  2207.  
  2208. +++++++++++++++++++++++++++
  2209.  
  2210. >From jmunkki@beta.hut.fi (Juri Munkki)
  2211. Date: 12 Feb 1996 20:06:14 GMT
  2212. Organization: Helsinki University of Technology
  2213.  
  2214. In article <311ED680.613A@best.com> digidave@best.com writes:
  2215. >My problem is the bottleneck procedure needs to communicate with the 
  2216. >rest of the code by setting application globals. The bottleneck 
  2217. >procedure is a callBack routine, and I don't have access to application 
  2218. >globals without setting up and restoring the A4 register (under Think C 
  2219. >it's A4 not A5).
  2220.  
  2221. Bottlenecks have full access to application globals. Unless you are writing
  2222. a code resource instead of a full application, the register is A5 just
  2223. like in all other environments.
  2224.  
  2225. >Since the bottleneck procedure doesn't include a reference constant 
  2226. >field as one of its arguments, I cannot pass the address of the 
  2227. >application's A4 to the bottleneck proc in order to do this.
  2228.  
  2229. If you need to do something like this, the usual procedure is to append
  2230. a field to the structure that is passed to the callback. In this case you
  2231. could add a field to the CGrafPort (allocate it yourself, of course) and
  2232. set it to A5. Fortunately it is not needed in this case.
  2233.  
  2234. -- 
  2235. Juri Munkki jmunkki@iki.fi        Life is easy when polygons are cheap.
  2236. http://www.iki.fi/jmunkki           Windsurfing: Faster than the wind.
  2237.  
  2238. +++++++++++++++++++++++++++
  2239.  
  2240. >From 'Digital Dave' Shields <digidave@best.com>
  2241. Date: Mon, 12 Feb 1996 20:11:14 -0800
  2242. Organization: Vanguard Vision Studios, San Francisco, CA
  2243.  
  2244. MonHacker wrote:
  2245. > Have you considered making your own OS queue?
  2246.  
  2247. I thought a Bottleneck procedure was called at "interrupt time". Is this 
  2248. not true? 
  2249.  
  2250. If so, that would mean one could not move memory. In a message queue 
  2251. structure, you have to allocate an object on the heap and add it in...or 
  2252. is there another way to set up a queue for this purpose?
  2253.  
  2254. --Dave
  2255.  
  2256. +++++++++++++++++++++++++++
  2257.  
  2258. >From pottier@drakkar.ens.fr (Francois Pottier)
  2259. Date: 13 Feb 1996 10:58:57 GMT
  2260. Organization: Ecole Normale Superieure, Paris, France
  2261.  
  2262. In article <31200F62.71D8@best.com>,
  2263. 'Digital Dave' Shields  <digidave@best.com> wrote:
  2264.  
  2265. >I thought a Bottleneck procedure was called at "interrupt time". Is this 
  2266. >not true? 
  2267.  
  2268. Although Juri has already said it, I will reiterate to clear some
  2269. misconceptions: if you are writing an application, your globals can be
  2270. accessed (off the A5 register) without needing to do anything special
  2271. in your bottleneck. Bottlenecks are not called at interrupt time; they
  2272. are called by DrawPicture and they are free to move memory, write into
  2273. global variables. I guess the only thing they can't do (unless you know
  2274. what you're doing) is to make QuickDraw calls.
  2275.  
  2276.  
  2277. -- 
  2278. Francois Pottier
  2279. Francois.Pottier@ens.fr
  2280. Francois.Pottier@inria.fr
  2281. http://www.eleves.ens.fr:8080/home/pottier/
  2282.  
  2283. +++++++++++++++++++++++++++
  2284.  
  2285. >From jmunkki@beta.hut.fi (Juri Munkki)
  2286. Date: 14 Feb 1996 00:39:51 GMT
  2287. Organization: Helsinki University of Technology
  2288.  
  2289. In article <31200F62.71D8@best.com> digidave@best.com writes:
  2290. >MonHacker wrote:
  2291. >> 
  2292. >> Have you considered making your own OS queue?
  2293. >
  2294. >I thought a Bottleneck procedure was called at "interrupt time". Is this 
  2295. >not true? 
  2296.  
  2297. It is not true. QD Bottlenecks are called from within QuickDraw. QuickDraw
  2298. may not be called from within interrupts. Thus, QD bottlenecks may move memory
  2299. and do just about anything you want.
  2300.  
  2301. >If so, that would mean one could not move memory. In a message queue 
  2302. >structure, you have to allocate an object on the heap and add it in...or 
  2303. >is there another way to set up a queue for this purpose?
  2304.  
  2305. OS Queues are useful because Enqueue and Dequeue disable interrupts
  2306. during critical sections so that you can access the queues from within
  2307. interrupts without having to worry about a non-interrupt level routine
  2308. being in the middle of changing the queue structure.
  2309.  
  2310. In this particular case, I don't see how they could be useful.
  2311.  
  2312. The normal procedure is that the queue entry is something like a
  2313. parameter block and the block is owned by the queue until it is
  2314. no longer needed. (If you call PBRead asynchronously, the parameter
  2315. block is reserved until the read completes.)
  2316.  
  2317. If you need to enqueue stuff from an interrupt level, you have to
  2318. preallocate the entries. The best way to do this is to allocate a
  2319. chunk of memory at startup and then enqueue entries from this
  2320. memory. When you need a block, you dequeue from the queue. When
  2321. the block is released, you enqueue it back into your free queue.
  2322.  
  2323. But, as I said, OS queues have very little to do with QD bottlenecks.
  2324.  
  2325. -- 
  2326. Juri Munkki jmunkki@iki.fi        Life is easy when polygons are cheap.
  2327. http://www.iki.fi/jmunkki           Windsurfing: Faster than the wind.
  2328.  
  2329. +++++++++++++++++++++++++++
  2330.  
  2331. >From dbrosius@chesco.com (Dave M Brosius)
  2332. Date: 17 Feb 1996 08:19:37 GMT
  2333. Organization: Chester County Internet Services, Inc.
  2334.  
  2335. In article <4fpqth$mu4@nef.ens.fr>, pottier@drakkar.ens.fr (Francois
  2336. Pottier) wrote:
  2337.  
  2338. > In article <31200F62.71D8@best.com>,
  2339. > 'Digital Dave' Shields  <digidave@best.com> wrote:
  2340. Bottlenecks are not called at interrupt time; they
  2341. > are called by DrawPicture and they are free to move memory, write into
  2342. > global variables. I guess the only thing they can't do (unless you know
  2343. > what you're doing) is to make QuickDraw calls.
  2344.  
  2345.  
  2346. You can however call the Stdxxxx forms of quickdraw calls.
  2347.  
  2348. -- 
  2349. Please reply via email as well
  2350. dave dbrosius@chesco.com
  2351.  
  2352. ---------------------------
  2353.  
  2354. >From mxmora@apple.com (Matthew Xavier Mora)
  2355. Subject: USENET Macintosh Programming Awards (UMPA)
  2356. Date: Fri, 16 Feb 1996 17:57:22 GMT
  2357. Organization: MXM Designs
  2358.  
  2359.  
  2360. Announcing The Second Annual USENET Macintosh Programming Awards
  2361.                            UMPA 1996
  2362.                      
  2363. It is now time to start nominating this years programmers. Below is
  2364. the article I sent out to the c.s.m.p.* newsgroups to start the
  2365. nomination process. Since I sent out that article Bare Bones Software
  2366. and Metrowerks said that they would sponsor this years event. Cool!
  2367.  
  2368. We have been getting a lot of prizes thanks to some evanglizing from
  2369. Jordan Mattson. Thanks Jordan.
  2370.  
  2371. So the list of prizes so far is:
  2372.  
  2373.  Every winner will get this stuff:
  2374.  - UMPA T -Shirt
  2375.  - UMPA Plaque.
  2376.  - $100.00 Cash Prize  (Oooh!)
  2377.  - $100.00 APDA Gift Certificate (from Juan Bettaglio ) 
  2378.  - A Self Paced Course from DU (from Jennifer Martin)
  2379.  - One years free membership in the Associates Plus or AMP program 
  2380.    ( Or an extension if currently enrolled from Cindy Gallie) 
  2381.  
  2382. The things below will go to the winners of the ShareWare, Freeware,
  2383. Support and Smart friend categories only since the Commercial winner
  2384. has all this stuff anyway.
  2385.  
  2386.  - Lots o' Symantec Stuff (includes Mac C++ and Java tools) 
  2387.     (from Will Iverson)
  2388.     t-shirts, option for any Symantec product NFR 
  2389.     (e.g. a choice of C++ Win, ACT!, Norton, etc.).
  2390.  - Apprentice CD (From Paul Celestin )
  2391.  
  2392.  - BBEdit and BBEdit T-shirts (From Rich Siegel)
  2393.  - Metrowerks Gold CD
  2394.  - QC from Devon Hubbard
  2395.  - Roaster the Java Development Environment from  Natural Intelligence 
  2396.  
  2397.  
  2398. A big thanks to our sponsors!
  2399.  
  2400. So send in your nominations!
  2401.  
  2402. Matt
  2403.  
  2404. - -----------------------------------------------------------
  2405. U M P A
  2406. - -----------------------------------------------------------
  2407.  
  2408. It looks like its time for the Second Annual Usenet Macintosh
  2409. Programming Awards (UMPA). For those of you that have never heard of
  2410. this before, last year we created the UMPA awards to honor our peers
  2411. in the Mac Programming world. Often a program itself will get awarded
  2412. but the person(s) responsible for creating the product never get their
  2413. due recognition for a job well done. This award is to honor those in
  2414. the trenches fighting the good fight for the Macintosh.
  2415.  
  2416. I would like to start the nomination process now and have it go until
  2417. the end of March. (Prizes determined by the number of vendors willing
  2418. to donate prizes)
  2419.  
  2420. Here is a list of the categories. The five categories are:
  2421.  
  2422.        Outstanding Programming for a Commercial Product.
  2423.  
  2424.        Outstanding Programming for a Shareware Product.
  2425.  
  2426.        Outstanding Programming for a Freeware Product
  2427.  
  2428.        Outstanding Support of the Mac programming community.
  2429.        (usually from a non programmer)
  2430.  
  2431.        Official SmartFriend(tm) award for the most helpful c.s.m.p.* net
  2432. citizen.
  2433.  
  2434.  
  2435. Here is a list of the current nominees (Remember we are nominating the
  2436. programmers not the product so please include the name of the
  2437. programmer(s)):
  2438.  
  2439.  
  2440. Outstanding Programming for a Commercial Product:
  2441.     1. Rich Siegel for BBEdit
  2442.     2. Jordan Zimmerman for QuickView/MPTA 
  2443.     3. OneClick (WestCode Software)
  2444.     
  2445. Outstanding Programming for a Shareware Product:
  2446.     1. Peter Lewis for Net Presenz
  2447.       
  2448. Outstanding Programming for a Freeware Product: 
  2449.     1. Michael Hecht for ResCompare
  2450.     2. Steve Dagley, Richard Reynolds, and Co. for FreePPP.
  2451.     3. Lindsay Davies and Carles Bellver for HTML tools for BBEdit  
  2452.     
  2453. Outstanding Support of the Mac programming community: 
  2454.     1. The folks at MetroWerks
  2455.     2. Neil Ticktin of MacTech Magazine
  2456.     
  2457. Official SmartFriend(tm) award :                      
  2458.     1. Jon Pugh, for many of his insights on AppleScript
  2459.  
  2460.  
  2461. The list of final nominees is chosen by the number times that
  2462. programmer was nominated. So if you want your favorite programmer 
  2463. to make the nomination cut, Send in his/her name. 
  2464.  
  2465. Since this award is supposed to be recognition from our peers, You
  2466. will need to answer a Macintosh programming question to have a valid
  2467. nomination.
  2468.  
  2469. The first question is:
  2470.  
  2471. What is the recommended sleep value for WaitNextEvent for a foreground
  2472. Application. :-)
  2473.  
  2474.  
  2475. So send me your nominations <mailto:mxmora@mxmdesigns.com> with what you
  2476. "think" is the correct answer to the above question and I will keep
  2477. updating the nomination list. I will set up a web page for this when
  2478. ever I can remember my password to my shell account.
  2479.  
  2480. If you would like to donate prizes to this cause, please send me email
  2481. <mailto:mxmora@mxmdesigns.com>. Last year we collected 5 prizes for each
  2482. category. This year I think we should just collect 4 prizes since the
  2483. "Outstanding Programming for a Commercial Product" winner already had
  2484. all the stuff we collected last year. The award,t-shirt and plaque cash
  2485. and other goodies is probably honor enough.
  2486.  
  2487. Thanks for listening and good luck to the nominees!
  2488.  
  2489.  
  2490. Xavier
  2491.  
  2492. -- 
  2493. Matthew Xavier Mora   
  2494. Developer Technical Support
  2495. Apple Computer, Inc.                                         mxmora@apple.com
  2496.  
  2497. ---------------------------
  2498.  
  2499. >From ericg@teleport.com (MystryMan)
  2500. Subject: [Q] NURBs and lighting
  2501. Date: 30 Jan 1996 14:17:58 -0800
  2502. Organization: Teleport - Portland's Public Access (503) 220-1016
  2503.  
  2504. Can anyone explain why when my camera is at ( 0 0 200 ) looking to ( 0 0 0 )
  2505. and my pointlight is at ( 0 0 -200 ), I see half the sphere colored in RED?
  2506.  
  2507. It seems to me that since the light on the opposite side of the sphere (as
  2508. compared to the camera), the side of the sphere I am viewing through the camera
  2509. should be black (I have no ambient light).
  2510.  
  2511. What am I missing?  It's probably something obvious, but I don't see it.
  2512.  
  2513. Since I know other people are interested in seeing an example of a NURB sphere
  2514. using QD3D, I am posting the entire metafile (it's small).
  2515.  
  2516.  
  2517.  
  2518. 3DMetafile ( 1 0 Normal tableofcontents0> )
  2519.   viewhints2:
  2520.   Container (
  2521.     ViewHints ( )
  2522.     interactiverenderer3:
  2523.     Container ( 
  2524.       InteractiveRenderer ( )
  2525.       InteractiveDoubleBufferBypass ( True )
  2526.     )
  2527.     viewangleaspectcamera4:
  2528.     Container (
  2529.       ViewAngleAspectCamera ( 0.8726646 1 )
  2530.       CameraPlacement (
  2531.         0 0 200 # location
  2532.         0 0 0 # point of interest
  2533.         0 1 0 # up vector
  2534.       )
  2535.       CameraRange ( 0.1 500 )
  2536.       CameraViewPort ( -1 1 2 2 )
  2537.     )
  2538.     pointlight5:
  2539.     Container (
  2540.       PointLight (
  2541.         0 0 -200 # location
  2542.         0 0 0 # attenuation
  2543.         False # castsShadows
  2544.       )
  2545.       LightData ( True # isOn
  2546.         1 # brightness
  2547.         1 0 0 # color
  2548.       )
  2549.     )
  2550.     attributeset6:
  2551.     Container (
  2552.       AttributeSet ( )
  2553.       AmbientCoefficient ( 1 )
  2554.       DiffuseColor ( 0.5 0.5 0.5 )
  2555.       SpecularColor ( 0.5 0.5 0.5 )
  2556.       SpecularControl ( 4 )
  2557.       TransparencyColor ( 1 1 1 )
  2558.     )
  2559.     ImageClearColor ( 0 0 1 0 )
  2560.     ImageDimensions ( 300 300 )
  2561.   )
  2562.   phongillumination7:
  2563.   PhongIllumination ( )
  2564.   interpolationstyle8:
  2565.   InterpolationStyle ( Pixel )
  2566.   backfacingstyle9:
  2567.   BackfacingStyle ( Both )
  2568.   fillstyle10:
  2569.   FillStyle ( Filled )
  2570.   ordereddisplaygroup11:
  2571.   BeginGroup ( 
  2572.     OrderedDisplayGroup ( )
  2573.   )
  2574.   scale12:
  2575.   Scale ( 75 75 75 )
  2576.   nurbpatch13:
  2577.   Container (
  2578.     NURBPatch (
  2579.       3 3 # uOrder, vOrder
  2580.       5 9 # numRows, numColumns
  2581.       0 -1 0 1 
  2582.       0 -0.707107 0 0.707107 
  2583.       0 -1 0 1 
  2584.       0 -0.707107 0 0.707107 
  2585.       0 -1 0 1 
  2586.       0 -0.707107 0 0.707107 
  2587.       0 -1 0 1 
  2588.       0 -0.707107 0 0.707107 
  2589.       0 -1 0 1 
  2590.       0.707107 -0.707107 0 0.707107 
  2591.       0.5 -0.5 0.5 0.5 
  2592.       0 -0.707107 0.707107 0.707107 
  2593.       -0.5 -0.5 0.5 0.5 
  2594.       -0.707107 -0.707107 0 0.707107 
  2595.       -0.5 -0.5 -0.5 0.5 
  2596.       0 -0.707107 -0.707107 0.707107 
  2597.       0.5 -0.5 -0.5 0.5 
  2598.       0.707107 -0.707107 0 0.707107 
  2599.       1 0 0 1 
  2600.       0.707107 0 0.707107 0.707107 
  2601.       0 0 1 1 
  2602.       -0.707107 0 0.707107 0.707107 
  2603.       -1 0 0 1 
  2604.       -0.707107 0 -0.707107 0.707107 
  2605.       0 0 -1 1 
  2606.       0.707107 0 -0.707107 0.707107 
  2607.       1 0 0 1 
  2608.       0.707107 0.707107 0 0.707107 
  2609.       0.5 0.5 0.5 0.5 
  2610.       0 0.707107 0.707107 0.707107 
  2611.       -0.5 0.5 0.5 0.5 
  2612.       -0.707107 0.707107 0 0.707107 
  2613.       -0.5 0.5 -0.5 0.5 
  2614.       0 0.707107 -0.707107 0.707107 
  2615.       0.5 0.5 -0.5 0.5 
  2616.       0.707107 0.707107 0 0.707107 
  2617.       0 1 0 1 
  2618.       0 0.707107 0 0.707107 
  2619.       0 1 0 1 
  2620.       0 0.707107 0 0.707107 
  2621.       0 1 0 1 
  2622.       0 0.707107 0 0.707107 
  2623.       0 1 0 1 
  2624.       0 0.707107 0 0.707107 
  2625.       0 1 0 1 
  2626.       0 0 0 1 1 2 2 3 3 4 4 4 # uKnots
  2627.       0 0 0 1 1 2 2 2 # vKnots
  2628.     )
  2629.     attributeset14:
  2630.     Container (
  2631.       AttributeSet ( )
  2632.       AmbientCoefficient ( 1 )
  2633.       DiffuseColor ( 1 1 1 )
  2634.       SpecularColor ( 1 1 1 )
  2635.       SpecularControl ( 4 )
  2636.     )
  2637.   )
  2638.   EndGroup ( )
  2639.   
  2640.  
  2641.  
  2642. ===Eric Gorr=================ericg@egi.com=================aka MystryMan===
  2643. _____            *  http://www.teleport.com/~ericg *
  2644. |\ /| * Invincibility is in oneself, vulnerability is in the opponent
  2645. | O | * Therefore the considerations of the intelligent always include both
  2646. |/_\|   benefit and harm (Sun Tzu)
  2647.  
  2648. #include <standard.disclaimer>
  2649. =====Insults, like violence, are the last resort of the incompetent...=====
  2650.  
  2651.  
  2652. +++++++++++++++++++++++++++
  2653.  
  2654. >From ericg@teleport.com (MystryMan)
  2655. Date: 31 Jan 1996 17:56:53 -0800
  2656. Organization: Teleport - Portland's Public Access (503) 220-1016
  2657.  
  2658. I have been able to get the correct side of the sphere lighted...but I
  2659. don't understand *why*.
  2660.  
  2661. By changing the backfacing style to kQ3BackfacingStyleFlip, the correct
  2662. part of the sphere is now lit.
  2663.  
  2664. When my object is not transparent, etc., why would the backfacing style
  2665. cause the opposite part of the sphere (in relation to the location of the
  2666. light) to be lit?
  2667.  
  2668. I find this very odd.
  2669.  
  2670.  
  2671.  
  2672. ===Eric Gorr=================ericg@egi.com=================aka MystryMan===
  2673. _____            *  http://www.teleport.com/~ericg *
  2674. |\ /| * Invincibility is in oneself, vulnerability is in the opponent
  2675. | O | * Therefore the considerations of the intelligent always include both
  2676. |/_\|   benefit and harm (Sun Tzu)
  2677.  
  2678. #include <standard.disclaimer>
  2679. =====Insults, like violence, are the last resort of the incompetent...=====
  2680.  
  2681.  
  2682. +++++++++++++++++++++++++++
  2683.  
  2684. >From Pablo Fernicola <pff@apple.com>
  2685. Date: Sun, 4 Feb 1996 21:51:33 GMT
  2686. Organization: Apple Computer, Inc.
  2687.  
  2688. In article <4ep6l6$1d9@kelly.teleport.com> MystryMan, ericg@teleport.com
  2689. writes:
  2690. >I have been able to get the correct side of the sphere lighted...but I
  2691. >don't understand *why*.
  2692. >
  2693. >By changing the backfacing style to kQ3BackfacingStyleFlip, the correct
  2694. >part of the sphere is now lit.
  2695.  
  2696. Sounds like your patch is inside out.
  2697.  
  2698. -Pablo
  2699. >Pablo Fernicola- pff@apple.com  -QuickDraw 3D Tech Lead
  2700. - --- This posting represents my personal opinions.----- 
  2701. - ---    I do not represent/speak for my employer.   -----
  2702.  
  2703. +++++++++++++++++++++++++++
  2704.  
  2705. >From vanessa@io.org (Vanessa Williams)
  2706. Date: Thu, 08 Feb 1996 15:45:29 -0500
  2707. Organization: Tessera Solutions
  2708.  
  2709. In article <1996Feb4.215133.22065@gallant.apple.com>, Pablo Fernicola
  2710. <pff@apple.com> wrote:
  2711.  
  2712. > In article <4ep6l6$1d9@kelly.teleport.com> MystryMan, ericg@teleport.com
  2713. > writes:
  2714. >
  2715. > >By changing the backfacing style to kQ3BackfacingStyleFlip, the correct
  2716. > >part of the sphere is now lit.
  2717. > Sounds like your patch is inside out.
  2718.  
  2719. What would one have to do wrong in order to create an inside-out patch?
  2720.  
  2721. > -Pablo
  2722. > >Pablo Fernicola- pff@apple.com  -QuickDraw 3D Tech Lead
  2723. > ----- This posting represents my personal opinions.----- 
  2724. > -----    I do not represent/speak for my employer.   -----
  2725.  
  2726. +++++++++++++++++++++++++++
  2727.  
  2728. >From ericg@teleport.com (MystryMan)
  2729. Date: 9 Feb 1996 11:46:27 -0800
  2730. Organization: Teleport - Portland's Public Access (503) 220-1016
  2731.  
  2732. In article <1996Feb4.215133.22065@gallant.apple.com>,
  2733. Pablo Fernicola  <pff@apple.com> wrote:
  2734. >In article <4ep6l6$1d9@kelly.teleport.com> MystryMan, ericg@teleport.com
  2735. >writes:
  2736. >>I have been able to get the correct side of the sphere lighted...but I
  2737. >>don't understand *why*.
  2738. >>
  2739. >>By changing the backfacing style to kQ3BackfacingStyleFlip, the correct
  2740. >>part of the sphere is now lit.
  2741. >
  2742. >Sounds like your patch is inside out.
  2743.  
  2744. Why should this matter?  Why would something seem to be lighted when the light
  2745. source is on the opposite side?  Or is this just the way lighting works?
  2746.  
  2747.  
  2748. ===Eric Gorr=================ericg@egi.com=================aka MystryMan===
  2749. _____            *  http://www.teleport.com/~ericg *
  2750. |\ /| * Invincibility is in oneself, vulnerability is in the opponent
  2751. | O | * Therefore the considerations of the intelligent always include both
  2752. |/_\|   benefit and harm (Sun Tzu)
  2753.  
  2754. #include <standard.disclaimer>
  2755. =====Insults, like violence, are the last resort of the incompetent...=====
  2756.  
  2757.  
  2758. +++++++++++++++++++++++++++
  2759.  
  2760. >From Pablo Fernicola <pff@apple.com>
  2761. Date: Sat, 10 Feb 1996 01:53:47 GMT
  2762. Organization: Apple Computer, Inc.
  2763.  
  2764. In article <vanessa-0802961545290001@ts44-03.tor.inforamp.net> Vanessa
  2765. Williams, vanessa@io.org writes:
  2766. >What would one have to do wrong in order to create an inside-out patch?
  2767.  
  2768. Here is the answer from Philip Schneider, our NURB specialist:
  2769.  
  2770. The best way to explain how a NURB patch is properly "formatted" is to
  2771. show an example of one in "canonical" position. 
  2772.  
  2773. The various fields of the TQ3NURBPatchData data structure must 
  2774. be set up correctly with respect to this, in terms of what the 
  2775. various fields are, how many knots one has, and the ordering of 
  2776. the control points.
  2777.  
  2778. Here's the data structure:
  2779.  
  2780. typedef struct TQ3NURBPatchData {
  2781.     unsigned long                            uOrder;
  2782.     unsigned long                            vOrder;
  2783.     unsigned long                            numRows;
  2784.     unsigned long                            numColumns;                                  
  2785.     TQ3RationalPoint4D           *controlPoints;
  2786.     float                                       *uKnots; 
  2787.     float                                       *vKnots;
  2788.     unsigned long                            numTrimLoops;
  2789.     TQ3NURBPatchTrimLoopData        *trimLoops;
  2790.     TQ3AttributeSet                          patchAttributeSet;
  2791. } TQ3NURBPatchData;
  2792.  
  2793. Consider a bicubic NURB patch that is facing you, and has 
  2794. 5 control points in the U direction,  and 4 control points 
  2795. in the V direction. Conceptually, a NURB patch's control points are 
  2796. a 2-dimensional array of points; of course, we have to represent
  2797. this as a list of points in C when we pass them into the NURB 
  2798. drawing routine. So, one has to make sure that the points are 
  2799. listed in the order in which QD3D expectsthem. That order is as 
  2800. follows:
  2801.  
  2802. 1. The first control point is at the lower left corner.
  2803. 2. The bottom row, corresponding to the U parameter direction, 
  2804.    is listed from left to right.
  2805. 3. Then, the next-up-from-the-bottom row is listed, and so on.
  2806.  
  2807. Here's some C specifying such a NURB patch:
  2808.  
  2809. static float *uKnots = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
  2810. static float *vKnots = { 0, 1, 2, 3, 4, 5, 6 ,7 };
  2811.  
  2812. static TQ3NURBPatchData *patchData = {
  2813.                                                                                                                 4,                         /*  uOrder  */
  2814.                                                                                                                 4,       /*  vOrder  */
  2815.                                                                                                                 4,       /*  numRows  */
  2816.                                                                                                                 5                             /*  numColumns                                                                                        
  2817.             
  2818.                                                                                                                 cp,      /*  control points
  2819.                                                                                                                 uKnots,  /*  u knots
  2820.                                                                                                                 vKnots,  /*  v knots
  2821.                                                                                                                 0,       /*  numTrimLoops
  2822.                                                                                                                 NULL,    /*  trimLoops          */
  2823.                                                                                                                 NULL     /*  patchAttributeSet  */
  2824.                                                                                                  };
  2825.  
  2826. I'll not list the control points' values, but rather show 
  2827. how they should be laid out to get the correct effect:
  2828.  
  2829.        15--16--17--18--19
  2830.        |   |   |   |   |
  2831.        10--11--12--13--14
  2832.        |   |   |   |   |
  2833.  ^     5---6---7---8---9
  2834.  |     |   |   |   |   |
  2835.  V     0---1---2---3---4
  2836.    
  2837.          U->
  2838.  
  2839. A failure to conform to this orientation will result either in
  2840. the NURB patch appearing to be "backwards"; failure to conform
  2841. to the proper relationship between rows/columns, uKnots/vKnots,
  2842. and/or uOrder/vOrder can result in bus errors due to the system
  2843. looking for more knots than you specified, wrong number of
  2844. control points, etc. etc.
  2845.  
  2846. - ----
  2847.  
  2848. A side effect of the patch being backwards or inside out is that its
  2849. vertex normals (used for lighting calculations) willl be pointing in the
  2850. wrong direction.
  2851.                                      
  2852. >Pablo Fernicola- pff@apple.com  -QuickDraw 3D Tech Lead
  2853. - --- This posting represents my personal opinions.----- 
  2854. - ---    I do not represent/speak for my employer.   -----
  2855.  
  2856. +++++++++++++++++++++++++++
  2857.  
  2858. >From jstratmn@inlink.com (Joe Stratmann)
  2859. Date: Thu, 15 Feb 1996 05:52:14 GMT
  2860. Organization: inlink
  2861.  
  2862.  
  2863. >Why should this matter?  Why would something seem to be lighted when the light
  2864. >source is on the opposite side?  Or is this just the way lighting works?
  2865.  
  2866.  
  2867. Can anyone tell me if Quickdraw 3D will support double-sided faces?
  2868.  
  2869. Thanks
  2870. Joe
  2871.  
  2872.  
  2873. +++++++++++++++++++++++++++
  2874.  
  2875. >From johnb@hk.super.net (John W. Blackburne)
  2876. Date: Thu, 15 Feb 1996 22:53:30 +0800
  2877. Organization: Tempest
  2878.  
  2879. In article <4fuh4c$aun@news1.inlink.com>, jstratmn@inlink.com (Joe
  2880. Stratmann) wrote:
  2881.  
  2882. :>Why should this matter?  Why would something seem to be lighted when the light
  2883. :>source is on the opposite side?  Or is this just the way lighting works?
  2884. :
  2885. :
  2886. :Can anyone tell me if Quickdraw 3D will support double-sided faces?
  2887.  
  2888. By default it will light both sides as if they were the same material,
  2889. i.e. with same colour, reflectiveness, etc. But most shapes have a front
  2890. and a back, and you can optionally turn off backfacing so it only draws
  2891. the front sides, good for polyhedra which will only be looked at from the
  2892. outside. When I did this with my code it gave it an appreciable speed
  2893. boost with SW only QD3D. I also discovered where I'd got the front and
  2894. backs of my polygons mixed up.
  2895.  
  2896. As for having a surface with opposite sides with different properties, I
  2897. don't know a way to do this. For the one place where I wanted this I just
  2898. created two squares and put them back to back. With backfacing off it's
  2899. probably little extra work for the drawing engine to do this, and it looks
  2900. just fine.
  2901.  
  2902. John
  2903. -- 
  2904. John Blackburne,                     johnb@tempest.net.hk
  2905. Programmer  Asia, Inc. Online:       http://www.asia-inc.com
  2906. Technology consultant and trainer:   http://www.hk.super.net/~johnb
  2907.  
  2908. +++++++++++++++++++++++++++
  2909.  
  2910. >From jstratmn@inlink.com (Joe Stratmann)
  2911. Date: Fri, 16 Feb 1996 18:02:53 GMT
  2912. Organization: inlink
  2913.  
  2914. johnb@hk.super.net (John W. Blackburne) wrote:
  2915.  
  2916. >By default it will light both sides as if they were the same material,
  2917. >i.e. with same colour, reflectiveness, etc. But most shapes have a front
  2918. >and a back, and you can optionally turn off backfacing so it only draws
  2919. >the front sides, good for polyhedra which will only be looked at from the
  2920. >outside. When I did this with my code it gave it an appreciable speed
  2921. >boost with SW only QD3D. I also discovered where I'd got the front and
  2922. >backs of my polygons mixed up.
  2923.  
  2924. >As for having a surface with opposite sides with different properties, I
  2925. >don't know a way to do this. For the one place where I wanted this I just
  2926. >created two squares and put them back to back. With backfacing off it's
  2927. >probably little extra work for the drawing engine to do this, and it looks
  2928. >just fine.
  2929.  
  2930. Thanks for replying to my mail John.  Ok, so QD3D does support
  2931. dual-faced polygons (don't need to have a different surface on either
  2932. side).
  2933.  
  2934. Now, assume you don't want backfacing on.  So you have to make sure
  2935. all faces are in the proper direction.  Is it possible for the program
  2936. to figure this out or not?
  2937.  
  2938. Also, how *do* you find out which way a polygon is facing?
  2939.  
  2940. Oh, one more (sorry for being so inquisitive) - what does "normalize"
  2941. mean and how do you do it?
  2942.  
  2943. Thanks again
  2944. Joe
  2945.  
  2946.  
  2947. +++++++++++++++++++++++++++
  2948.  
  2949. >From johnb@hk.super.net (John W. Blackburne)
  2950. Date: Sat, 17 Feb 1996 18:44:00 +0800
  2951. Organization: Tempest
  2952.  
  2953. In article <4g2ga9$l8a@news1.inlink.com>, jstratmn@inlink.com (Joe
  2954. Stratmann) wrote:
  2955.  
  2956. :johnb@hk.super.net (John W. Blackburne) wrote:
  2957. :
  2958. :>By default it will light both sides as if they were the same material,
  2959. :>i.e. with same colour, reflectiveness, etc. But most shapes have a front
  2960. :>and a back, and you can optionally turn off backfacing so it only draws
  2961. :>the front sides, good for polyhedra which will only be looked at from the
  2962. :>outside. When I did this with my code it gave it an appreciable speed
  2963. :>boost with SW only QD3D. I also discovered where I'd got the front and
  2964. :>backs of my polygons mixed up.
  2965. :
  2966. :>As for having a surface with opposite sides with different properties, I
  2967. :>don't know a way to do this. For the one place where I wanted this I just
  2968. :>created two squares and put them back to back. With backfacing off it's
  2969. :>probably little extra work for the drawing engine to do this, and it looks
  2970. :>just fine.
  2971. :
  2972. :Thanks for replying to my mail John.  Ok, so QD3D does support
  2973. :dual-faced polygons (don't need to have a different surface on either
  2974. :side).
  2975. :
  2976. :Now, assume you don't want backfacing on.  So you have to make sure
  2977. :all faces are in the proper direction.  Is it possible for the program
  2978. :to figure this out or not?
  2979.  
  2980. The program figures it out by way of the parameters you specify to create
  2981. an object, e.g. the order in which vertices are given when specifying a
  2982. polygon, or the vectors are given when specifying a cube.
  2983.  
  2984. The problem is the mathematics of this is IMHO pretty tricky - it's
  2985. complex to express and even more complex to apply. Rather than sit down
  2986. and mathematically work out the orientation of the polygions in meshes
  2987. I've created I've found it easier to just throw them all into the mesh,
  2988. turn off back-facing, see what it looks like, then reverse those (by
  2989. reversing the order of the vertices given to Q3Mesh_FaceNew) which looked
  2990. wrong.
  2991.  
  2992. :Also, how *do* you find out which way a polygon is facing?
  2993.  
  2994. See above. If you want the maths it is different for different geometric
  2995. objects but can all be found in the QD3D docs.
  2996.  
  2997. :Oh, one more (sorry for being so inquisitive) - what does "normalize"
  2998. :mean and how do you do it?
  2999.  
  3000. A 'normalized' vector (which I'm more used to calling a unit vector) is
  3001. one with unit length, e.g. if the vector is [x, y, z] then x^2 + y^2 + z^2
  3002. = 1. To 'normalize' a vector is to turn it into such a vector, by finding
  3003. a vector in the same direction but of unit length. Unit vectors are useful
  3004. for certain vector calcualtions, and are required by QD3D for setting up
  3005. certain cameras. Thnkfully you never need to normalize a vector in QD3D,
  3006. as it provides a function (Q3Vector3D_Normalize) to do it for you.
  3007.  
  3008. John
  3009. -- 
  3010. John Blackburne,                     johnb@tempest.net.hk
  3011. Programmer  Asia, Inc. Online:       http://www.asia-inc.com
  3012. Technology consultant and trainer:   http://www.hk.super.net/~johnb
  3013.  
  3014. ---------------------------
  3015.  
  3016. >From joost@sirius.com (Joost Romeu)
  3017. Subject: pragma once vs #ifndef
  3018. Date: 8 Feb 1996 17:32:36 GMT
  3019. Organization: sirius.com
  3020.  
  3021. I understand that:
  3022.  
  3023. #pragma once   // placed at the top of a header file
  3024.  
  3025. is a preprocessor directive that tells the compiler not to include the
  3026. current header file being compiled (ie. the one that contains it) if that
  3027. header has already been included in the same src file
  3028.  
  3029.  I also understand that by placing - at the top of the header file,
  3030. <FILENAME>.h the statements:
  3031.  
  3032. > #ifndef_<FILENAME>_H
  3033. > #define_<FILENAME>_H
  3034. >...
  3035. >#endif   // end of header file
  3036.  
  3037. Says, in effect, if filename.h hasn't been defined, then define it,
  3038. otherwise skip it...
  3039.  
  3040.    ?1: Are these two preprocessor statements equivalent?
  3041.  
  3042.    ?2: Which one is better to use for the duplicate header problem?
  3043.  
  3044.    ?3: Is either more efficient? (Does #pragma have to do a bit-by-bit
  3045. copy/compare?)
  3046.  
  3047. Thanks
  3048.  
  3049. -- 
  3050. please also reply as email...
  3051.  
  3052. +++++++++++++++++++++++++++
  3053.  
  3054. >From dbrosius@chesco.com (Dave M Brosius)
  3055. Date: 10 Feb 1996 06:45:30 GMT
  3056. Organization: Chester County Internet Services, Inc.
  3057.  
  3058. In article <joost-0802960933550001@ppp072-sf2.sirius.com>,
  3059. joost@sirius.com (Joost Romeu) wrote:
  3060.  
  3061. > I understand that:
  3062. > #pragma once   // placed at the top of a header file
  3063. > is a preprocessor directive that tells the compiler not to include the
  3064. > current header file being compiled (ie. the one that contains it) if that
  3065. > header has already been included in the same src file
  3066. >  I also understand that by placing - at the top of the header file,
  3067. > <FILENAME>.h the statements:
  3068. > > #ifndef_<FILENAME>_H
  3069. > > #define_<FILENAME>_H
  3070. > >...
  3071. > >#endif   // end of header file
  3072. > Says, in effect, if filename.h hasn't been defined, then define it,
  3073. > otherwise skip it...
  3074. >    ?1: Are these two preprocessor statements equivalent?
  3075. >    ?2: Which one is better to use for the duplicate header problem?
  3076. >    ?3: Is either more efficient? (Does #pragma have to do a bit-by-bit
  3077. > copy/compare?)
  3078. > Thanks
  3079. > -- 
  3080. > please also reply as email...
  3081.  
  3082. #ifndef_<FILENAME>_H
  3083. #define_<FILENAME>_H
  3084.  
  3085. is guaranteed to work with any compiler. Why #pragma once may or may not....
  3086.  
  3087. That alone is enough for me to choose the #ifndef version
  3088.  
  3089. -- 
  3090. dave dbrosius@chesco.com
  3091.  
  3092. +++++++++++++++++++++++++++
  3093.  
  3094. >From gurgle@apple.com (Pete Gontier)
  3095. Date: Tue, 13 Feb 1996 15:09:06 -0800
  3096. Organization: Apple Computer, Inc.
  3097.  
  3098. In article <joost-0802960933550001@ppp072-sf2.sirius.com>,
  3099. joost@sirius.com (Joost Romeu) wrote:
  3100.  
  3101.  >    ?1: Are these two preprocessor statements equivalent?
  3102.  >    ?2: Which one is better to use for the duplicate header problem?
  3103.  >    ?3: Is either more efficient? (Does #pragma have to do a bit-by-bit
  3104.  >          copy/compare?)
  3105.  
  3106. For more information than you ever wanted, post these questions to
  3107. comp.lang.c. The answers may even be in the FAQ.
  3108.  
  3109. But briefly, the #pragma is theoretically faster because it tells the
  3110. compiler to subsequently avoid looking for the file or reading it. The
  3111. #ifdef trick still allows for the possibility that the compiler will go
  3112. look for the file and read it. (The search often takes longer than the
  3113. read, of course.)
  3114.  
  3115. Some compilers are clever and recognize the #ifdef trick and treat it the
  3116. #pragma. But since this isn't really conformant behavior (you might #undef
  3117. the symbol specifically to get the duplication on the second #include),
  3118. there's generally a compiler switch to control it.
  3119.  
  3120. Another option you have is to shield your #include statements:
  3121.  
  3122. #ifndef __WINDOWS__
  3123. #   include <Windows.h>
  3124. #endif
  3125.  
  3126. I do this all the time for the Toolbox headers because they aren't smart
  3127. enough to use the #pragma. For my own headers I use the #pragma.
  3128.  
  3129. - ---------
  3130.  
  3131.   Pete Gontier, Integer Poet, Apple Macintosh Developer Technical Support
  3132.  
  3133.   work      mail  <mailto:gurgle@apple.com>
  3134.   personal  mail  <mailto:gurgle@ccnet.com>
  3135.   personal  web   <http://www.ccnet.com/~gurgle>
  3136.   work      web   <http://dev.info.apple.com/dts.html>
  3137.  
  3138. +++++++++++++++++++++++++++
  3139.  
  3140. >From rdwells@mmm.com (Richard Wells)
  3141. Date: Fri, 16 Feb 1996 17:17:40 -0600
  3142. Organization: 3M Company
  3143.  
  3144. Pete Gontier wrote:
  3145. > In article <joost-0802960933550001@ppp072-sf2.sirius.com>,
  3146. > joost@sirius.com (Joost Romeu) wrote:
  3147. >  >    ?1: Are these two preprocessor statements equivalent?
  3148. >  >    ?2: Which one is better to use for the duplicate header problem?
  3149. >  >    ?3: Is either more efficient? (Does #pragma have to do a bit-by-bit
  3150. >  >          copy/compare?)
  3151. > For more information than you ever wanted, post these questions to
  3152. > comp.lang.c. The answers may even be in the FAQ.
  3153.  
  3154. I doubt that it's in the FAQ, since "#pragma once" is not sufficiently
  3155. universal.  It is common in the Mac world, but I don't know of any PC
  3156. or Unix compilers that support it.
  3157.  
  3158. So if your code is intended to be portable, I wouldn't use it.  Since
  3159. most of what I write does have to be portable, I stick to the #ifndef
  3160. method.
  3161.  
  3162. Opinions expressed herein are my own and may not represent those of 3M.
  3163.  
  3164. +++++++++++++++++++++++++++
  3165.  
  3166. >From clay@herky.cs.uiowa.edu (Matthew Clay)
  3167. Date: 17 Feb 1996 05:13:00 GMT
  3168. Organization: University of Iowa, Iowa City, IA, USA
  3169.  
  3170. >From article <31251094.4220@mmm.com>, by rdwells@mmm.com (Richard Wells):
  3171. > Pete Gontier wrote:
  3172. >> 
  3173. >> In article <joost-0802960933550001@ppp072-sf2.sirius.com>,
  3174. >> joost@sirius.com (Joost Romeu) wrote:
  3175. >> 
  3176. >>  >    ?1: Are these two preprocessor statements equivalent?
  3177. >>  >    ?2: Which one is better to use for the duplicate header problem?
  3178. >>  >    ?3: Is either more efficient? (Does #pragma have to do a bit-by-bit
  3179. >>  >          copy/compare?)
  3180. >> 
  3181. >> For more information than you ever wanted, post these questions to
  3182. >> comp.lang.c. The answers may even be in the FAQ.
  3183. > I doubt that it's in the FAQ, since "#pragma once" is not sufficiently
  3184. > universal.  It is common in the Mac world, but I don't know of any PC
  3185. > or Unix compilers that support it.
  3186. > So if your code is intended to be portable, I wouldn't use it.  Since
  3187. > most of what I write does have to be portable, I stick to the #ifndef
  3188. > method.
  3189.  
  3190. This eternal debate was recently revisited in comp.lang.c++.moderated,
  3191. and I think the strongest arguments were for #ifndef...#endif. For the
  3192. original questions,
  3193.  
  3194. 1) They're pretty close to equivalent if available. The advantages of
  3195. #pragma once is that it doesn't introduce a new symbol name, and that
  3196. at least initially, it allowed faster tests. Nothing however prevents
  3197. a compiler from recognizing the common #ifndef...#endif pattern and
  3198. treating it  similarly.
  3199.  
  3200. 2) Given that #pragma means "preprocessor/compiler hint", #pragma once is
  3201. not a terribly portable construct, though many a book suggests otherwise.
  3202. In terms of copies sold, I would assume Microsoft Visual C++ is the
  3203. world's most popular compiler and it doesn't understand #pragma once.
  3204.  
  3205. 3) I'm not sure I understand bit comparison in this context, but note
  3206. it's probably unwise to have several header files with the same name
  3207. in the same project or search tree.
  3208.  
  3209. And it's not in the faq but is definitely is frequently asked.
  3210.  
  3211. -mc
  3212.  
  3213.  
  3214.  
  3215. +++++++++++++++++++++++++++
  3216.  
  3217. >From jps@tfs.com (Jeff Stearns)
  3218. Date: 15 Feb 1996 21:48:04 GMT
  3219. Organization: TRW Financial Systems
  3220.  
  3221. In article <joost-0802960933550001@ppp072-sf2.sirius.com>,
  3222. Joost Romeu <joost@sirius.com> compares #pragma once to #ifndef/#define/#endif.
  3223.  
  3224. >   ?1: Are these two preprocessor statements equivalent?
  3225. >
  3226. >   ?2: Which one is better to use for the duplicate header problem?
  3227. >
  3228. >   ?3: Is either more efficient? (Does #pragma have to do a bit-by-bit copy/compare?)
  3229.  
  3230. They usually have the same effect.  #pragma once is probably more efficient
  3231. because the compiler can keep a list of the names of files which have already
  3232. been #included.  When it encounters a #include somefile directive, it can
  3233. search the list and do nothing if it discovers that somefile is already
  3234. on the list.  (It probably compares only filenames, not file contents.)
  3235.  
  3236. This is faster than searching for the file, opening it, and parsing it for
  3237. #ifndef/#endif pairs.
  3238.  
  3239. I have seen failures with both methods on various platforms:
  3240.     Symantec C version 6 includes the wrong file occasionally if there is a
  3241.     header file in the source tree which has the same name as a header in the
  3242.     compiler tree (for example, if there is a local "errors.h" and
  3243.     an <Errors.h>.) and the "Include headers only once" option is selected.
  3244.     
  3245.     Sun's SPARCworks C compiler also makes mistakes in the way that it caches
  3246.     #include files, reading the wrong one on rare occasions.
  3247.  
  3248. Both bugs stem from the compiler's attempt to speed things up by keeping
  3249. lists of #include files already visited.
  3250.  
  3251. On the whole, I've experienced fewer bugs using the #ifndef/#define/#endif
  3252. method.
  3253.  
  3254. ---------------------------
  3255.  
  3256. End of C.S.M.P. Digest
  3257. **********************
  3258.  
  3259.